2016-05-13 119 views
0

这不是重复的,因为我已经阅读了与此有关的其他问题,但它没有给我我正在寻找的答案。如何在获取元素之前等待页面加载?

我在Java中使用Selenium进行UI自动化。

我的代码是这样的:

WebDriver driver; 
public MyClass() 
    { 
     UIEvents auto = new UIEvents(); 
     driver = new FirefoxDriver(); 
     driver.manage().window().maximize(); 
     driver.get("my URL"); 

     LoginPage loginPage = new LoginPage(driver, auto); 
     waitForPageLoad(); 
     loginPage.setEmail("[email protected]"); 
     loginPage.setPassword("1234"); 
     loginPage.clickLogin(); 
    } 



    public void waitForPageLoad() 
    { 
     JavascriptExecutor js = (JavascriptExecutor)driver; 
     final boolean response = js.executeScript("return document.readyState").equals("complete"); 

     if(response == false) 
     { 
      waitForPageLoad(); 
     } 
} 

这仍然会给我一个错误,因为它正在搜索仍然不存在的元素。

回答

0

这是一个远射。但请尝试将“等于”更改为“equalsIgnoreCase”。

final boolean response = js.executeScript("return document.readyState").equalsIgnoreCase("complete"); 
+0

,响应变化真正的页面是在调试过程中,我可以看到加载完成。我运行我的应用程序时发生了我的问题。 –

+0

此外,executeScript()中没有equalsIgnoreCase。 –

+0

对不起,我添加了.toString()---> js.executeScript(“return document.readyState”)。toString()。equalsIgnoreCase(“complete”); –

0
WebDriver driver_; 

public void waitForPageLoad() { 

    Wait<WebDriver> wait = new WebDriverWait(driver_, 30); 
    wait.until(new Function<WebDriver, Boolean>() { 
     public Boolean apply(WebDriver driver) { 
      System.out.println("Current Window State  : " 
       + String.valueOf(((JavascriptExecutor) driver).executeScript("return document.readyState"))); 
      return String 
       .valueOf(((JavascriptExecutor) driver).executeScript("return document.readyState")) 
       .equals("complete"); 
     } 
    }); 
} 
2

您也可以等到需要的元素存在,可见,可点击,...

waitFor(ExpectedConditions.presenceOfElementLocated(By.id("yourMailInputId"))); 
+0

如果上述ID的元素不在第一位,该怎么办?这会永远等待吗? –

+0

@ShizukaMasuda不,selenium驱动程序有一个属性,“超时”并且会等待默认值,我想是6-10秒,如果找不到就会抛出异常。但是你应该使用你知道在页面中的元素,或者应该是,那么如果没有出现,你知道你的页面发生了错误 – cralfaro

相关问题