2012-03-30 5 views
1

Ich verwende @FindBy Annotationen, um Elemente auf meiner Seite zu finden. Gefällt mir:Wait.until() mit Webdriver PageFactory Elementen

@FindBy(xpath = "//textarea") 
    public InputBox authorField; 

Bitte helfen Sie. Ich möchte warten (ExpectedConditions) mit meinen kommentierten Elementen. Wie folgt aus:

wait.until(visibilityOfElementLocated(authorField)); 

statt:

wait.until(visibilityOfElementLocated(By.xpath("//textarea"))); 

Dank für das Voraus

Antwort

1
ExpectedConditions.visibilityOf(authorField); 

Schauen Sie sich den Quellcode einer Erwarteten Bedingung an. Es ist sehr einfach, deine eigene Kondition zu schreiben, die alles machen kann, was du willst.

+0

Danke, ich habe meine eigenen Bedingungen und die Arbeit erstellt! – Arthur

3

Das Problem ist, dass die Einnahme von Methoden ein WebElement in der Regel die WebElement annehmen wurde bereits gefunden (Und sie haben recht PageFactory anordnet! es so, dass kurz bevor das Element von einer Methode zugegriffen wird, gefunden wird.), dh auf der Seite existiert. Wenn Sie der Methode "By" sagen, sagen Sie "Ich will, dass es gefunden wird, ich weiß nur nicht, wann es auftauchen wird".

können Sie

wait.until(visibilityOf(authorField)); 

in Verbindung verwenden, um mit

// right after driver is instantiated 
driver.manage().timeouts().implicitlyWait(...); 

, dass es nur die Art und Weise tun sollten Sie möchten.

implicitlyWait()documentation sagt:

die Menge an Zeit Gibt der Fahrer warten soll, wenn für ein Element suchen, wenn es nicht sofort vorhanden ist.

Bei der Suche nach einem einzelnen Element sollte der Treiber die Seite abfragen, bis das Element gefunden wurde, oder diese Zeit läuft ab, bevor eine NoSuchElementException ausgelöst wird. Bei der Suche nach mehreren Elementen sollte der Treiber die Seite abfragen, bis mindestens ein Element gefunden wurde oder dieses Zeitlimit abgelaufen ist.

Also, im Grunde wartet es darauf, dass jedes Mal ein Element angezeigt wird, wenn es nachgeschlagen wird. Was natürlich für alle Arten von asynchronen Anfragen gut ist.

+0

implizitWie gut für asynchrone Seitenladung? Weil ich es mit AJAX benutzen muss? – Arthur

+0

Antwort (was ein "Ja" ist) ... in der Antwort bearbeitet. :) –

+0

Danke! Immerhin hatte Pavel Zorin Recht und auch das muss ich selbst schreiben. – Arthur

1

Ich weiß, dass diese Frage bereits beantwortet wurde und vor einer Weile gefragt wurde, aber ich dachte, dass ich ein konkretes Beispiel dafür geben würde, wie man seine eigene Erwartete Bedingung dafür schreibt. Durch die Schaffung Klasse dieses Erwarteter Zustand:

/** 
* Since the proxy won't try getting the actual web element until you 
* call a method on it, and since it is highly unlikely (if not impossible) 
* to get a web element that doesn't have a tag name, this simply will take 
* in a proxy web element and call the getTagName method on it. If it throws 
* a NoSuchElementException then return null (signaling that it hasn't been 
* found yet). Otherwise, return the proxy web element. 
*/ 
public class ProxyWebElementLocated implements ExpectedCondition<WebElement> { 

    private WebElement proxy; 

    public ProxyWebElementLocated(WebElement proxy) { 
     this.proxy = proxy; 
    } 

    @Override 
    public WebElement apply(WebDriver d) { 
     try { 
      proxy.getTagName(); 
     } catch (NoSuchElementException e) { 
      return null; 
     } 
     return proxy; 
    } 

} 

Dann wird diese ermöglichen es Ihnen zu tun:

wait.until(new ProxyWebElementLocated(authorField)); 

Und das ist alles, was Sie wirklich brauchen.Aber wenn man die Abstraktion noch einen Schritt weiter gehen wollen, könnten Sie eine Klasse wie folgt erstellen:

public final class MyExpectedConditions { 

    private MyExpectedConditions() {} 

    public static ExpectedCondition<WebElement> proxyWebElementLocated(WebElement proxy) { 
     return new ProxyWebElementLocated(proxy); 
    } 
} 

die dann erlauben würden Sie so etwas wie dies zu tun:

wait.until(MyExpectedConditions.proxyWebElementLocated(authorField)); 

Die MyExpectedConditions Klasse sein kann ein bisschen Overkill für einen Erwarteten Zustand, aber wenn Sie mehrere Erwartete Bedingungen haben, dann macht es die Dinge viel schöner.

Als abschließende Bemerkung für alle, die wirklich wollen, die extra Meile zu gehen, können Sie auch Methoden ergänzen die MyExpectedConditions Klasse, die die Methoden in der ExpectedConditions Klasse wickeln, und dann können Sie alle Ihre erwarteten Bedingungen Sachen von einem Ort erhalten . (Ich würde vorschlagen, ExpectedConditions anstelle der Wrapper-Methoden zu erweitern, aber es hat einen privaten Konstruktor, so dass es unmöglich zu erweitern. Dies bleibt Wrapper-Methoden als die einzige Option für diejenigen, die alles an einem Ort wollen.)

Verwandte Themen