2016-05-13 211 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

相關問題