Ich verwende die Selenium 2 Java API mit FirefoxDriver. Wenn ich ein Formular ausfülle, werden der Seite abhängig von den Formulareingaben Kontrollkästchen hinzugefügt.
Ich möchte mit Selen einen Klick auf diese Kontrollkästchen simulieren. Das Element ist in einem normalen Browser sichtbar und verwendbar, aber Selen behauptet, dass die Elemente nicht sichtbar sind.
"Element is not currently visible and so may not be interacted with"
Kann ich Selen zwingen, den nicht sichtbaren Zustand der Elemente zu ignorieren? Wie kann ich Selen zwingen, mit dem nicht sichtbaren Element zu interagieren?
java
selenium-webdriver
djondal
quelle
quelle
Antworten:
Selen bestimmt anhand der folgenden Kriterien, ob ein Element sichtbar ist oder nicht (verwenden Sie einen DOM-Inspektor, um zu bestimmen, welche CSS für Ihr Element gilt, und achten Sie auf den berechneten Stil):
Ihr Element entspricht einem dieser Kriterien. Wenn Sie nicht in der Lage sind, das Design des Elements zu ändern, können Sie dies folgendermaßen mit Javascript tun (vorausgesetzt, Sie haben WebDriver angenommen, da Sie Selenium2 API gesagt haben):
Dies löst jedoch kein Javascript-Ereignis aus. Wenn Sie für diese Eingabe vom Änderungsereignis abhängig sind, müssen Sie es ebenfalls auslösen (viele Möglichkeiten, dies zu tun, am einfachsten, die auf dieser Seite geladene Javascript-Bibliothek zu verwenden).
Die Quelle für die Sichtbarkeitsprüfung -
https://github.com/SeleniumHQ/selenium/blob/master/javascript/atoms/dom.js#L577
Die WebDriver-Spezifikation, die dies definiert -
https://dvcs.w3.org/hg/webdriver/raw-file/tip/webdriver-spec.html#widl-WebElement-isDisplayed-boolean
quelle
Manchmal bedeutet dies, dass eine Seite mehrere Elemente enthält, die dieselbe Eigenschaft haben, nach der Sie suchen möchten, und dass Sie "mit der falschen sprechen".
Wenn Ihr Element nicht eindeutig durch: id oder: name (oder: class) identifiziert werden kann, kann es schwierig sein.
Manchmal hilft die Suche nach dem Element über: xpath, und in einigen Fällen ist sogar das nicht praktikabel.
In diesen Fällen müssen Sie möglicherweise alle Elemente abrufen, die Ihren Kriterien entsprechen, und anhand des Index auf das richtige verweisen. Es ist schmutzig, aber es funktioniert.
Ich verwende Selenium / Watir von der Ruby on Rails-App. In meinem Fall wäre das Beispiel:
Hoffe das hilft.
quelle
Ich hatte ein ähnliches Problem, aber es hing damit zusammen, dass das Element im Ansichtsfenster nicht sichtbar war. Ich machte einen Screenshot und stellte fest, dass das Browserfenster zu eng war und das Element nicht gesehen werden konnte. Ich habe eines davon gemacht und es hat funktioniert:
Siehe: WebDriver.maximize_window ()
quelle
Oder Sie können die Selenium-Aktionsklasse verwenden, um die Benutzerinteraktion zu simulieren - zum Beispiel
quelle
Es gibt auch einen anderen Fall, in dem sichtbares Element als nicht sichtbar erkannt wird:
Um zu überprüfen, ob das Element, mit dem Sie nicht interagieren möchten, CSS-transformiert ist, gehen Sie auf CHROME folgendermaßen vor:
quelle
Die Unsichtbarkeit kann auch auf den Zeitpunkt zurückzuführen sein, zu dem das Element langsam erscheinen soll. In diesem Fall kann es hilfreich sein, den Browser zu zwingen, etwas zu warten.
Siehe z. B. die Frage, wie WebDriver warten soll, bis ein Element vorhanden ist .
quelle
Ich hatte das gleiche Problem mit Selen 2 in Internet Explorer 9, aber mein Fix ist wirklich seltsam. Ich konnte nicht in Eingaben in meinem Formular klicken -> Selen-Wiederholungen, sie sind nicht sichtbar.
Es trat auf, als meine Form gekrümmte Schatten hatte -> http://www.paulund.co.uk/creating-different-css3-box-shadows-effects : im konkreten "Effekt Nr. 2"
Ich habe keine Ahnung, warum und wie diese Pseudoelementlösung die Selentests gestoppt hat, aber es funktioniert für mich.
quelle
Sie können den Zugriff auf / das Ändern von Elementen, auf die der Benutzer normalerweise keinen Zugriff hat, nicht erzwingen, da Selenium die Benutzerinteraktion imitieren soll.
Wenn dieser Fehler auftritt, überprüfen Sie, ob:
maximize()
in node.js ,maximize_window()
in Python).executeScript()
in node.js ,execute_script()
in Python).quelle
Ich löse diesen Fehler nur, während ich Capybara in einem Projekt verwende, indem ich Folgendes hinzufüge:
zu
features/support/env.rb
.quelle
Ich löse diesen Fehler nur, indem ich auf die Anzeigeeigenschaft des Elements warte
quelle
Ich gerate in die ElementNotVisibleException-Ausnahme und verwende Selen für Funktionstests auf einer Django-Site mit Bootstrap-Glyphicons als Links in Vorlagen wie folgt:
Während meiner Funktionstests wird der Bootstrap-Stil nicht geladen. Wenn Sie dann versuchen, auf solche Links zu klicken, wird ElementNotVisibleException ausgelöst. Ich schaffe es, sie anklickbar zu machen, indem ich einfach ein Leerzeichen in das Tag einfüge :
quelle
Auf dieser Seite gibt es viele gute Antworten.
Beide werden oben in verschiedenen Details diskutiert. Die Antwort, die ich nicht gesehen habe, war ScrollToElement. Es hört sich so an, als würden Sie eine Liste von Elementen verarbeiten, während Sie mehr Elemente und Kontrollkästchen erstellen. Dies kann dazu führen, dass Elemente in Ihrer Liste von der sichtbaren Seite verschoben werden. Manchmal kann man das Element mit bloßem Auge sehen, aber man kann einfach nicht darauf klicken. Bei der Verarbeitung von Listen muss manchmal das Scrollen unterbrochen werden.
Da ich darauf stoße, habe ich eine PageScroll.java erstellt und dort meine Bildlaufskripte abgelegt. Hier sind einige Methoden aus dieser Klasse:
Weitere Beispiele finden Sie unter Scrollen von Elementen in die Ansicht mit Selen
quelle
Die akzeptierte Antwort hat bei mir funktioniert. Unten finden Sie einen Code, um das übergeordnete Element zu finden, das Selenium für nicht sichtbar hält.
quelle
Um mein Sandkorn hier hinzuzufügen: Wenn sich ein Element hinter einem festen Teil befindet, wird es als nicht sichtbar betrachtet und Sie können nicht darauf klicken. Das ist mir kürzlich passiert und ich habe es gelöst, indem ich ein Skript ausgeführt habe, wie oben empfohlen.
quelle