84

waitForElementPresentクリックする前に要素が表示されているかどうかを確認するために似たようなものを探しています。これはでできると思ったimplicitWaitので、以下を使用しました。

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

次にクリックします

driver.findElement(By.id(prop.getProperty(vName))).click();

残念ながら、要素を待機する場合と待機しない場合があります。私はしばらく探して、この解決策を見つけました:

for (int second = 0;; second++) {
    Thread.sleep(sleepTime);
    if (second >= 10)
        fail("timeout : " + vName);
    try {
        if (driver.findElement(By.id(prop.getProperty(vName))).isDisplayed())
            break;
    } catch (Exception e) {
        writeToExcel("data.xls", e.toString(), parameters.currentTestRow, 46);
    }
}
driver.findElement(By.id(prop.getProperty(vName))).click();

そしてそれは大丈夫待っていました、しかしタイムアウトする前にそれは10回5、50秒待たなければなりませんでした。少し多い。そこで、暗黙的に待機を1秒に設定しましたが、これまではすべて問題ないようでした。なぜなら、タイムアウトする前に10秒待つものもあれば、1秒後にタイムアウトするものもあるからです。

コードに存在する/表示される要素の待機をどのようにカバーしますか?どんなヒントもかなりあります。

4

4 に答える 4

166

これが私のコードでのやり方です。

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

また

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

正確には。

以下も参照してください。

于 2012-07-31T10:55:38.827 に答える
13

Explicit wait または Fluent Wait を使用できます

明示的な待機の例 -

WebDriverWait wait = new WebDriverWait(WebDriverRefrence,20);
WebElement aboutMe;
aboutMe= wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("about_me")));     

Fluent Waitの例 -

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

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

詳細については、このチュートリアルを確認してください。

于 2016-10-25T13:02:31.367 に答える
-5

上記の待機ステートメントは、明示的な待機の良い例です。

明示的な待機は、特定の Web 要素に限定されたインテリジェントな待機です (上記の x-path で説明したように)。

明示的な待機を使用することにより、基本的にWebDriverに、あきらめる前にXユニット(timeoutInSecondsとして指定したもの)を待機することを最大で伝えることになります。

于 2014-10-27T04:14:21.347 に答える