2016-04-08 3 views
2

Wie kann ich den geb webdriver dazu bewegen, zu einem Element auf der Seite zu wechseln, das möglicherweise nicht in der Ansicht des Browsers ist? Das Element ist auf der Seite vorhanden und wird angezeigt. Es besteht jedoch die Möglichkeit, dass das Element unten auf der Seite angezeigt wird und der Browser nach unten scrollen muss, um das Element anzuzeigen.Wie wird in den Seiteninhalt der Seite gewechselt, der im Browserfenster nicht sichtbar ist?

import geb.Page 
class myPage extends Page { 
    static url = "mypage.xhtml" 
    static at = {title == "myPage"} 
    static content = { 
    someElement = {$("#bottomOfPage")} 
    anotherElement = {$(".someClass",5)} 
    } 

    void clickElement(){ 
    //possibility to fail because element may not be displayed in browsers view 
    //if not in view, scroll to element, then click 
    someElement.click() 
    } 
} 

Mit dieser Seite als Beispiel: Wenn ein Element nicht im Hinblick auf die Seite und möglicherweise ganz am Ende, wie kann ich das WebDriver sagen, das Element in den Blick zu bringen? Ich habe einige komplizierte Tests, die fehlschlagen, wenn der Inhalt der Seite nicht angezeigt wird. In einigen Fällen bewegt sich der Treiber zum Element, auch wenn es nicht angezeigt wird. Aber ich möchte dem Fahrer explizit sagen, dass er sich zu einem Element bewegen soll, wenn er nicht für die Fälle in Sicht ist, in denen er sich nicht selbst bewegt.

Die Selenium-Bibliothek hat eine moveToElement() - Funktion, akzeptiert jedoch nur Objekte der WebElement-Klasse. Beim Erstellen von Seitenklassen werden alle Elemente, die in meinen Tests verwendet werden, im Inhaltsabschnitt deklariert und gehören daher zur SimplePageContent-Klasse. SimplePageContent kann auch nicht in ein WebElement umgewandelt werden. moveToElement(By.id("bottomOfPage")) funktioniert, ist aber nicht ideal, weil ich keine hartcodierten Werte möchte. Ich übergebe lieber das Seiteninhaltsobjekt selbst, wenn es möglich ist.

+0

Ich glaube, Sie haben eine Methode moveToElement auf Ihrer Seite Objektklassen hinzuzufügen. Die Methode verwendet JavaScriptExecutor, um JS auszuführen, um nach der Position des Objekts zu scrollen. Siehe unter http://stackoverflow.com/questions/12293158/page-scroll-up-or-down-in-selenium-webdriver-selenium-2-using-java&hl=de&hl=de – Buaban

Antwort

3

Aus meiner Erfahrung kann ich sagen, dass wenn Sie WebDriver bitten, auf ein Element zu klicken, das gerade nicht angezeigt wird, wird zuerst zu diesem Element geblättert und dann darauf geklickt. Sie treffen also entweder eine Art Bug, wenn es nicht passiert, oder die Tatsache, dass das Element nicht sichtbar ist, ist nicht das, was dazu führt, dass Ihr Element nicht angeklickt wird.

Wenn Sie noch aus Ihrer Content Definition zurückgegebenen Objekte leicht drehen können Sie dann mit Actions.moveToElement() explizit auf das Element verschoben werden sollen unter Verwendung der Tatsache, dass sie Navigator implementieren, die mit einem firstElement() kommt, die Sie, wenn Sie die ersten bekommen verwenden sollen WebElement eines Multielements Navigator oder singleElement() wenn Ihre Navigator genau eine WebElement hat.

Es gibt auch einen einfacheren Weg, die WebElement s von Ihrem Navigator s Extraktion nicht erforderlich - verwenden Sie einen interact {} Block:

interact { 
    moveToElement(someElement) 
} 
+0

hmm Ich habe gerade einen Schnelltest gemacht, um zu versuchen, auf ein Element zu klicken, das nicht sichtbar war und du hast Recht. Es wird zu dem Element geblättert und geklickt. Ich hätte in meiner Frage ein Beispiel geben sollen, wie man einen Wert auch in ein Textfeld eingibt. Ich schaute zurück auf meinen Code und wenn das a Textfeld nicht in Sicht ist, wird es keinen Wert eingeben und somit den Test nicht bestehen. Ich hatte in Interaktion mit {} untersucht, aber ich bekomme immer "kann das Symbol 'moveToElement' nicht auflösen". Gibt es etwas, das importiert werden muss? – WontonJon

+0

Die Tatsache, dass das Textfeld nicht angezeigt wird, sollte nicht verhindern, dass der Text in das Textfeld eingegeben wird. Gibt es etwas Besonderes an der Textbox? Sind Sie sicher, dass der Wert nicht in das Textfeld eingegeben wird? Was ist die volle StackTrace die du bekommst? Wie benutzt du es? In einem Test, einer Seite oder einem Modul? – erdi

+0

Ich bekomme keine Stack-Trace-Fehler. Die Elemente sind nur Eingabefelder, die Textfelder sind. Mein Test füllt ein Formular aus. Die Textfelder, die im Browserfenster sichtbar sind, erhalten Werte, aber die Textfelder, die nicht in der Browseransicht sind, werden nicht gefüllt. Selbst wenn Sie Haltepunkte verwenden, zeigt dies, dass sie sich füllen. es ist, als ob sie nicht übersprungen werden. Ich habe am Ende eine Hilfsfunktion mit den Aktionen erstellt.moveToElement() -Methode, um explizit zu den störrischen Textfeldern zu wechseln, und das hat funktioniert. Es ist wirklich seltsam, lol. Für jetzt ist dies eine vernünftige Lösung. – WontonJon

Verwandte Themen