it-swarm.com.ru

Как ждать, пока элемент присутствует в Selenium?

Я пытаюсь заставить Selenium ждать элемента, который динамически добавляется в DOM после загрузки страницы. Пробовал это:

fluentWait.until(ExpectedConditions.presenceOfElement(By.id("elementId"));

Если это поможет, вот fluentWait:

FluentWait fluentWait = new FluentWait<>(webDriver) {
    .withTimeout(30, TimeUnit.SECONDS)
    .pollingEvery(200, TimeUnit.MILLISECONDS);
}

Но он выдает NoSuchElementException - похоже, presenceOfElement ожидает, что элемент будет там, так что это ошибка. Это должно быть хлебом с маслом для Selenium и не хочу изобретать велосипед ... кто-нибудь может предложить альтернативу, в идеале, не катя мою собственную Predicate?

42
Steve Chambers

Вам нужно вызвать ignoring за исключением, чтобы игнорировать, пока WebDriver будет ждать. 

FluentWait<WebDriver> fluentWait = new FluentWait<>(driver)
        .withTimeout(30, TimeUnit.SECONDS)
        .pollingEvery(200, TimeUnit.MILLISECONDS)
        .ignoring(NoSuchElementException.class);

Смотрите документацию FluentWait для получения дополнительной информации. Но учтите, что это условие уже реализовано в ExpectedConditions , поэтому вам следует использовать

WebElement element = (new WebDriverWait(driver, 10))
   .until(ExpectedConditions.elementToBeClickable(By.id("someid")));

Базовое руководство по ожиданию можно найти здесь .

57
Petr Mensik
WebDriverWait wait = new WebDriverWait(driver,5)
wait.until(ExpectedConditions.visibilityOf(element));

вы можете использовать это как некоторое время перед загрузкой кода всей страницы, и сгенерировать ошибки. время в секундах 

4
bhupendra

Позвольте мне порекомендовать вам использовать Selenide library. Позволяет писать гораздо более краткие и удобочитаемые тесты. Может ожидать появления элементов с гораздо более коротким синтаксисом:

$("#elementId").shouldBe(visible);

Вот пример проекта для тестирования поиска Google: https://github.com/selenide-examples/google

1
Andrei Solntsev

FluentWait выдает NoSuchElementException в случае путаницы

org.openqa.Selenium.NoSuchElementException;     

с

Java.util.NoSuchElementException

в 

.ignoring(NoSuchElementException.class)
0
palandlom
public WebElement fluientWaitforElement(WebElement element, int timoutSec, int pollingSec) {

    FluentWait<WebDriver> fWait = new FluentWait<WebDriver>(driver).withTimeout(timoutSec, TimeUnit.SECONDS)
        .pollingEvery(pollingSec, TimeUnit.SECONDS)
        .ignoring(NoSuchElementException.class, TimeoutException.class).ignoring(StaleElementReferenceException.class);

    for (int i = 0; i < 2; i++) {
        try {
            //fWait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//*[@id='reportmanager-wrapper']/div[1]/div[2]/ul/li/span[3]/i[@data-original--title='We are processing through trillions of data events, this insight may take more than 15 minutes to complete.']")));
        fWait.until(ExpectedConditions.visibilityOf(element));
        fWait.until(ExpectedConditions.elementToBeClickable(element));
        } catch (Exception e) {

        System.out.println("Element Not found trying again - " + element.toString().substring(70));
        e.printStackTrace();

        }
    }

    return element;

    }
0
Ashwini