2017-01-16 2 views
0

Warum funktioniert mein explizites Warten nicht?Mein 'Explicit Wait' funktioniert nicht, aber 'Implicit Wait' funktioniert?

  1. Mein implizites Warten funktioniert, aber mein explizites Warten scheint das zugewiesene Zeitlimit nicht zu verwenden?

  2. Zum Beispiel, wenn ich das Explicit Timeout auf 300Sekunden setze, wird es zum impliziten Timeout zurückkehren oder wenn ich das implizite Timeout auskommentiere, wird es sofort eine Fehler/Timeout Ausnahme auslösen.

Kode:

public class Base_Page extends TestListenerAdapter { 
public @FindBy(css = ".ajax_loader") WebElement ajaxLoadScreen; 
public @FindBy(css = "#preloaderSpinner") WebElement preloadSpinner; 
public WebDriver driver; 
public String packageName; 
public String className; 
public WebDriverWait wait; 
protected JavascriptExecutor jsExecutor; 

public Base_Page(WebDriver driver) throws Exception { 
    this.driver = driver; 

    this.wait = new WebDriverWait(this.driver, 300); 

    this.driver.manage().window().maximize(); 
    this.driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
    this.driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS); 

    Properties p = new Properties(); 
    FileInputStream fi = new FileInputStream(Constant.CONFIG_PROPERTIES_DIRECTORY); 
    p.load(fi); 
    this.browser_type = p.getProperty("browser"); 
    this.page_url = p.getProperty("url"); 
} 

public void loadPage() throws Exception { 
    this.driver.get(page_url); 
} 

public void clickMyAccount() { 
    driver.findElement(By.xpath(".//*[@id='account_links']/li[1]/a2")).click(); 
} 

public void clickHelp() { 
    this.driver.findElement(By.xpath(".//*[@id='help_links']/li[1]/a")).click(); 
} 

enter image description here

+0

Zeigen Sie Ihren Code als Text, aber nicht als Bild – Andersson

+0

@Andersson alle – Gbru

+0

getan Wo Sie eine explizite Warte mit? – Josh

Antwort

3
  1. Nein, ist es nicht eine Frage der Zuordnung Phil. Als Josh richtig erkannt haben Sie definiert ein explizites warten hier:

    ;

, aber sie sind nicht wirklich es verwenden. Um es zu benutzen, müssen Sie eine weitere Zeile direkt unterhalb der Warte Variable (Ich ziehe Boolean zu verwenden und dann basierend auf dem Ergebnis klicken oder nicht entscheiden!):

Boolean elementPresent = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(".//*[@id='account_links']/li[1]/a2"))).isDisplayed()); 

Jetzt können Sie voran gehen und kommentiere deine implizite Wartezeit. Nachdem Sie Ihren Code oben ausgeführt haben, wartet Ihr Programm im Grunde auf 300sec (das ist ein bisschen zu viel, aber Sie müssen eine spezielle Anforderung haben!) Für das Element angezeigt in dem Xpath angezeigt werden.

Le'ts davon ausgehen, dass der webElement erscheint nach 4 Sekunden vergangen sind. Dann wird es sofort TRUE zurückgeben (das ist praktisch, muss nicht die gesamte Wartezeit warten). Andernfalls wird das Polling fortgesetzt, bis die vollen 300 Sekunden vergangen sind, und dann natürlich FALSE zurückgegeben. So kann man den Fluss von da an manipulieren, das heißt:

If(elementPresent==true){ 
//click element 
} 
else{ 
System.out.println("Oops! Couldn't locate element!") 
} 
  1. Es ist eigentlich nicht ‚Zurücksetzen‘ (aber ich weiß, wie man darüber nachgedacht), aber es ist einfach Verwenden Sie Ihre implizite Wartezeit als die explizite Wartezeit wurde definiert, aber nicht verwendet!. Es wurde sofort eine Ausnahme ausgelöst, nachdem das Element nicht gefunden wurde, da nach dem Kommentieren des impliziten Wartens überhaupt keine Wartezeiten gesetzt wurden!

Natürlich ist es besser, diese Wartezeit in einem Verfahren zu bleiben (mit möglichen Parametern, xpathLocator und timeOut) aber jetzt hier ist ein Code, so dass Sie überprüfen können, ti funktioniert:

public void clickMyAccount() { 
    WebDriver wait = new WebDriverWait(driver, 300); 

    Boolean elementPresent = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(".//*[@id='account_links']/li[1]/a2"))).isDisplayed()); 


    If(elementPresent==true){ 
      driver.findElement(By.xpath(".//*[@id='account_links']/li[1]/a2")).click();    
    } 
    else{ 
    System.out.println("Oops! Couldn't locate element!") 
    } 

Hoffnung das hilft!

+0

vielen Dank noch einmal für Ihre Hilfe, denken Sie, es ist ratsam, sowohl implizite als auch explizite Warte-Setups im selben Projekt zu haben? – Gbru

+0

Hallo Phil, wenn meine Antwort in der Tat geholfen hat, drücke bitte auf den Pfeil nach oben, um es zu upvoten. Persönlich, nein, ich denke nicht, dass das implizite Warten notwendig ist, nachdem Sie Ihr explizites Warten definiert haben (eines löscht das andere). Wie bereits erwähnt, können Sie eine neue Methode namens waitForElement (String Xpath, int timeOut) erstellen und den xpath und die Wartezeit entsprechend Ihren Anforderungen übergeben. Dies ist zu vermeiden, die ganze Zeit zu tippen, die Definition der expliziten warten + wait.until usw. –

+0

danke nochmal @Xwris Stoixeia – Gbru