クリックする前に要素が表示されるかどうかを確認するために、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秒後にタイムアウトするものもあるためです。
コードに存在する/表示される要素の待機をどのようにカバーしますか?すべてのヒントはかなりのものです。
これが私のコードでのやり方です。
WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>));
または
wait.until(ExpectedConditions.elementToBeClickable(By.id<locator>));
正確に言うと。
こちらもご覧ください:
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"));
}
});
これを確認してください チュートリアル 詳細については。
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)
);