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 сек, и все казалось прекрасным до сих пор. Потому что теперь некоторые вещи ждут 10s до тайм-аута, но некоторые другие вещи тайм-аут после 1s.
как вы покрываете ожидание элемента, присутствующего / видимого в вашем коде? Любой намек заметен.
4 ответа:
вот как я это делаю в моем коде.
WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds); wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>));
или
wait.until(ExpectedConditions.elementToBeClickable(By.id<locator>));
чтобы быть точным.
Читайте также:
- орг.openqa.селен.поддержка.пользовательский интерфейс.Ожидаемые условия для подобных ярлыков для различных сценариев ждать.
- org.openqa.селен.поддержка.пользовательский интерфейс.WebDriverWait различные конструкторы.
Вы можете использовать явное ожидание или свободное ожидание
пример явного ожидания -
WebDriverWait wait = new WebDriverWait(WebDriverRefrence,20); WebElement aboutMe; aboutMe= wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("about_me")));
пример свободного ожидания -
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/2313. что-то в этом роде работало достаточно хорошо, даже если немного грубой силы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) );
выше оператор wait является хорошим примером явного ожидания.
поскольку явные ожидания-это интеллектуальные ожидания, которые ограничены определенным веб-элементом (как упоминалось выше в x-path).
используя явные ожидания, вы в основном говорите WebDriver на максимуме, чтобы дождаться X единиц (все, что вы дали в качестве timeoutInSeconds) времени, прежде чем он сдастся.