WebDriver - зачекайте на елемент за допомогою Java


79

Я шукаю щось подібне, щоб 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 секунд.

Як ви охоплюєте очікування елемента, присутнього / видимого у вашому коді? Будь-який натяк помітний.

Відповіді:


154

Ось як я це роблю у своєму коді.

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

або

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

якщо бути точним.

Дивитися також:


2
Дякую! Якби я раніше знав про цей клас, моє життя було б простішим :)
том

Як мені включити ваш код у цей формат? @FindBy(how = How.ID, using = "signup-button") WebElement signUpButton;Більше того, я все ще отримую NPE з вашим кодом. Схоже, він намагається отримати elementToBeClickable. Як ми можемо використовувати цей метод, коли елемент не завантажений?
HelloWorldNoMore

10

Ви можете використовувати явне очікування або вільне очікування

Приклад явного очікування -

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

Докладнішу інформацію див. У цьому посібнику .


1
Цей метод застарілий.
JGFMK

5

У нас багато умов для перегонів 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)
        );

-5

Вгорі оператор очікування є гарним прикладом явного очікування.

Оскільки явні очікування - це розумні очікування, які обмежуються певним веб-елементом (як згадувалося вище у x-path).

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


5
Додайте фрагмент коду до своєї відповіді, оскільки інші користувачі можуть сортувати відповіді по-різному, і контекст для "Вище" може змінитися для них.
Devraj Gadhavi

минуло 5 років, і все ще чекають фрагмента коду, тому це може мати сенс для інших, хто шукає інформацію по темі.
Капернеоаніс

Якщо хтось хотів би дізнатись більше про цю відповідь. guru99.com/implicit-explicit-waits-selenium.html
Муртаза Хаджі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.