Подтвердить что ты не робот

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 с.

Как вы покрываете ожидание присутствия/видимости элемента в вашем коде? Любой намек заметен.

4b9b3361

Ответ 1

Вот как я это делаю в своем коде.

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

или

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

если быть точным.

См. также:

Ответ 2

Вы можете использовать Явное ожидание или Свободное Ожидание

Пример Явного ожидания -

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

Подробнее об этом TUTORIAL.

Ответ 3

У нас много условий гонки с 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)
        );

Ответ 4

Выше выражение ожидания - хороший пример Явного ожидания.

В качестве явных ожиданий понимаются интеллектуальные ожидания, которые ограничены определенным веб-элементом (как указано выше в x-пути).

Используя явные ожидания, вы в основном говорите WebDriver на максимуме, чтобы ждать единиц X (независимо от того, что вы указали как timeoutInSeconds) времени, прежде чем он откажется.