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%FindElements
ändere, dann bekomme ich EIN Element, also gibt es nichts anderes auf der Seite. FindElement
für ein Feld vor der Schaltfläche verwende, sagen wir addEmployees-employee
, dann addEmployees-employee
ist displayed
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
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.
Stellen Sie sicher, dass das Element "div.modal_footer" keinen Grund hat, warum SWD es als nicht sichtbar betrachten sollte.
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.
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.
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
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%Tags und Links angularjs c# selenium-webdriver angular-strap