web-dev-qa-db-ja.com

WebDriver-Javaを使用して要素を待つ

クリックする前に要素が表示されるかどうかを確認するために、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秒後にタイムアウトするものもあるためです。

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

68
tom

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

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

または

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

正確に言うと。

こちらもご覧ください:

135
Ashwin Prabhu

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

明示的な待機の例-

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

流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"));     
 }  
});  

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

9
anuja jain

elementToBeClickableには多くの競合状態があります。 https://github.com/angular/protractor/issues/231 を参照してください。これらの線に沿ったものは、少し力ずくでもかなりうまく機能しました

Awaitility.await()
        .atMost(timeout)
        .ignoreException(NoSuchElementException.class)
        .ignoreExceptionsMatching(
            Matchers.allOf(
                Matchers.instanceOf(WebDriverException.class),
                Matchers.hasProperty(
                    "message",
                    Matchers.containsString("is not clickable at point")
                )
            )
        ).until(
            () -> {
                this.driver.findElement(locator).click();
                return true;
            },
            Matchers.is(true)
        );
5
andrej