2013-04-15 59 views
5

在webdriver代碼中,如果我使用thread.sleep(20000)。它等待20秒,我的代碼也可以正常工作。 要存檔相同的,如果我使用像webdriver implicitWait不按預期方式工作

driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); 

這不是強制20秒就在3到4秒來等待並進入下一步驟隱含的等待。並且頁面仍在加載。

這是有線情況,因爲我使用流利的等待來查找一些元素。如果元素仍然在頁面上加載,它不會顯示錯誤並使測試通過。

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) 
    .withTimeout(50, TimeUnit.SECONDS) 
    .pollingEvery(5, TimeUnit.SECONDS) 
    .ignoring(NoSuchElementException.class); 

WebElement foo = wait.until(new Function<WebDriver, WebElement>() { 
    public WebElement apply(WebDriver driver) { 
    return driver.findElement(By.id("jxxx")); 
    } 
}); 

但是,如果我說錯了ID它等待50秒,但其他測試通過沒有點擊..它沒有顯示任何錯誤。

我的問題是我應該怎麼避免Thread.sleep()其他硒方法不幫助我..

+0

感謝您查看此@JimEvans,我編輯了我的代碼,現在只使用流暢的等待,但它沒有發出任何錯誤,也沒有做任何事情。 – user2254173

回答

3

使用下面的方法來等待一個元素:

public boolean waitForElementToBePresent(By by, int waitInMilliSeconds) throws Exception 
{ 

    int wait = waitInMilliSeconds; 
    int iterations = (wait/250); 
    long startmilliSec = System.currentTimeMillis(); 
    for (int i = 0; i < iterations; i++) 
    { 
     if((System.currentTimeMillis()-startmilliSec)>wait) 
      return false; 
     List<WebElement> elements = driver.findElements(by); 
     if (elements != null && elements.size() > 0) 
      return true; 
     Thread.sleep(250); 
    } 
    return false; 
} 

而下面的方法是等待頁面加載:

public void waitForPageLoadingToComplete() throws Exception { 
    ExpectedCondition<Boolean> expectation = new ExpectedCondition<Boolean>() { 
     public Boolean apply(WebDriver driver) { 
      return ((JavascriptExecutor) driver).executeScript(
        "return  document.readyState").equals("complete"); 
     } 
    }; 
    Wait<WebDriver> wait = new WebDriverWait(driver, 30); 
    wait.until(expectation); 
} 

讓我們假設您正在等待頁面加載。然後用等待時間和頁面加載後出現的任何元素調用第一種方法,然後它將返回true,其他明智false。使用它像,

waitForElementToBePresent(By.id("Something"), 20000) 

上述調用的函數等待,直到它找到給定的持續時間內給定的元素。

嘗試以下任何代碼之後上述方法

WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds); 
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>)); 

wait.until(ExpectedConditions.elementToBeClickable(By.id<locator>)); 

更新:

public boolean waitForTextFiled(By by, int waitInMilliSeconds, WebDriver wdriver) throws Exception 
    { 
     WebDriver driver = wdriver; 
     int wait = waitInMilliSeconds; 
     int iterations = (wait/250); 
     long startmilliSec = System.currentTimeMillis(); 
     for (int i = 0; i < iterations; i++) 
     { 
      if((System.currentTimeMillis()-startmilliSec)>wait) 
       return false; 
      driver.findElement(By.id("txt")).sendKeys("Something"); 
      String name = driver.findElement(by).getAttribute("value"); 

      if (name != null && !name.equals("")){ 
       return true; 
      } 
      Thread.sleep(250); 
     } 
     return false; 
    } 

這將嘗試在該文本字段中輸入文本,直到在給定的時間米利斯。如果getAttribute()不適合您的情況,請使用getText()。如果文本被髮送,則返回true。把最大的時間放在你可以等到。

+0

感謝您的回覆。但問題是如果頁面仍處於加載狀態,我不知道驅動程序如何找到所有定位器。並通過測試。但實際上它不會輸入或點擊任何元素。但是,如果我把Thread.sleep它等待並填充並單擊元素。 頁面加載完美只有我把thread.sleep() – user2254173

+0

驅動程序找到只有相應的元素時纔可見的定位器。您必須等到成功完成加載頁面。然後,只有所有元素都可見,並且可以通過適當的元素定位器來識別驅動程序。看我的編輯。 – user2087450

+0

我使用了代碼。它的等待元素呈現,但只有和只有當我把thread.sleep()它的寫作文本在輸入框(在該元素)。作爲元素是alraedy加載爲什麼不寫? waitForElementToBePresent(By.id(「txt」),20000); driver.manage()。window()。了Thread.sleep(10000); driver.findElement(By.id(名爲 「txt」))的SendKeys( 「文本」)。 – user2254173

0

您可能想要嘗試使用此元素在屏幕上顯示。

new WebDriverWait(10, driver).until(ExpectedConditions.visibilityOfElementLocated(By.id("jxxx")). 

在這種情況下,等待時間最長爲10秒。

+0

感謝您的回覆。但問題是如果頁面仍處於加載狀態,我不知道驅動程序如何找到所有定位器。並通過測試。但實際上它不會輸入或點擊任何元素。但是,如果我把Thread.sleep它等待並填充並單擊元素。 頁面加載完美只有我把thread.sleep() – user2254173

+0

我看到你正在等待,直到元素存在。檢查要存在的元素是否會查看元素是否加載到DOM中,無論是否可見。等待元素變得可見是正確的。 –