"Element ist momentan nicht sichtbar und kann daher nicht interagiert werden", aber ein anderes ist?

8

Ich habe eine weitere Frage erstellt, die meiner Meinung nach die Ursache für diesen Fehler ist: Warum denkt der Selenium Firefox-Treiber, dass mein Modal nicht angezeigt wird, wenn der Elternteil übergelaufen ist: versteckt?

Selenversion 2.33.0
Firefox-Treiber

Der Code, der den Fehler verursacht:

%Vor%

Die Schaltfläche, auf die es zu klicken versucht:

%Vor%
  • Wenn ich den Aufruf zu FindElements ändere, dann bekomme ich EIN Element, also gibt es nichts anderes auf der Seite.
  • Wenn ich FindElement für ein Feld vor der Schaltfläche verwende, sagen wir addEmployees-employee , dann addEmployees-employee ist displayed
  • Im Browser selbst sieht es gut aus, ich muss nur auf die Schaltfläche klicken und das gewünschte Verhalten wird ausgeführt, aber der Webdriver weigert sich, das angezeigte Element zu berücksichtigen

Wie kommt es, dass ein Feld als angezeigt betrachtet werden kann und das andere nicht?

Das Modal mit der Schaltfläche zum Hinzufügen rechts unten, alle anderen Elemente werden angezeigt = true

Die Fenstergröße beträgt 1200x645 pro driver.Manage().Window.Size;
Der Elementstandort ist: 800x355y pro driver.FindElement(By.Id(buttonName)).Location
Die Elementdimensionen sind: 51x30 pro driver.FindElement(By.Id(buttonName)).Size
Der Speicherort des Kennwortelements lautet: 552x233y pro driver.FindElement(By.Id("addEmployees-password")).Size

    
ton.yeung 11.07.2013, 19:58
quelle

5 Antworten

4

Selenium WebDriver prüft nicht nur auf Opazität! = 0, Sichtbarkeit = Wahr, Höhe & gt; 0 und display! = None für das aktuelle Element in Frage, aber es wird auch die Ahnenkette des DOM aufgespürt, um sicherzustellen, dass keine übergeordneten Elemente vorhanden sind, die ebenfalls mit diesen Checkern übereinstimmen. ( UPDATE ) Nach dem JSON-Code, auf den sich alle Bindungen beziehen, benötigt SWD auch Überlauf! = versteckt , wie auch ein paar andere Fälle .)

Ich würde zwei Dinge tun, bevor ich den Code umstrukturiere, wie @Brian es vorschlägt.

  1. Stellen Sie sicher, dass das Element "div.modal_footer" keinen Grund hat, warum SWD es als nicht sichtbar betrachten sollte.

  2. Injizieren Sie etwas Javascript, um das fragliche Element in Ihrem Browser hervorzuheben, damit Sie sicher wissen, dass Sie das richtige Element ausgewählt haben. Sie können diesen Kern als Ausgangspunkt verwenden. Wenn die Schaltfläche in einem gelben Rahmen hervorgehoben ist, wissen Sie, dass Sie das richtige Element ausgewählt haben. Wenn nicht, bedeutet dies, dass das ausgewählte Element sich an einer anderen Stelle im DOM befindet. Wenn dies der Fall ist, haben Sie wahrscheinlich keine eindeutigen IDs, was die Manipulation des DOM sehr verwirrend macht.

Wenn ich raten müsste, würde ich sagen, dass Nummer zwei das ist, worauf Sie stoßen. Das ist mir auch passiert, wo ein Entwickler eine Element-ID wiederverwendet hat, die zu Konflikten führte, in welchem ​​Element du finden solltest.

    
bbbco 16.07.2013, 14:42
quelle
5

Brians Antwort war richtig: Verwenden Sie eine explizite Wartezeit im Vergleich zu Thread.Sleep (). Sleep () ist im Allgemeinen spröde, du verlierst fünf Sekunden unnötig, und außerdem ist es nur ein wirklich verdorbenes Verfahren für automatisiertes Testen. (Es hat lange gedauert, das zu lernen, also bist du dort nicht alleine.)

Vermeiden Sie implizite Wartezeiten. Sie arbeiten im Allgemeinen für neue Elemente, die dem DOM hinzugefügt werden, nicht für Übergänge, damit Dinge wie ein Modal aktiv werden können.

Explizite Wartezeiten haben eine große Menge von ExpectedConditions ( detailliert in der Javadox ), die Sie über diese Probleme hinwegbringen können. Verwenden Sie die ExpectedCondition, die dem Status entspricht, den Sie für Ihre nächste Aktion benötigen.

Siehe auch Ian Roses toller Blogpost zum Thema , auch.

    
Jim Holmes 15.07.2013 22:34
quelle
1

Nachdem ich dies im Chat besprochen habe, denke ich, dass die beste Lösung (zumindest jetzt) ​​darin besteht, den Knopf aus der Fußzeile für dein Modal und in den Körper davon zu verschieben.

Dies ist, was Sie wollen (für jetzt):

%Vor%

Und nicht das:

%Vor%     
Brian 11.07.2013 22:40
quelle
1

Ich hatte das gleiche Problem mit dem Element nicht sichtbar und kann daher nicht interagiert werden. es wurde gerade gelöst. Ich habe meinen Selen Stand Alone Server aktualisiert. vorherige Version war 2.33.0 und jetzt ist es 2.35.0

    
Arpan Buch 28.10.2013 05:23
quelle
0

In meinem Fall war das Element bereits auf der Seite vorhanden, aber es wurde deaktiviert, Das hat also nicht funktioniert (Python):

%Vor%

es ist mit Fehler fehlgeschlagen:

%Vor%

Um mein Problem zu lösen, musste ich ein paar Sekunden warten ( time.sleep(5) ), bis das Element sichtbar wurde.

Sie können das Element auch mit JavaScript, einem Python-Beispiel, aktivieren:

%Vor%     
Pedro Lobito 26.03.2015 08:20
quelle