WebDriver для закрытия всплывающего окна через определенное время

#java #selenium #selenium-webdriver #webdriver #webdriverwait

#java #селен #selenium-webdriver #webdriver #webdriverwait

Вопрос:

У меня есть Selenium WebDriver основанный тест, который заполняет форму и отправляет ее на обработку. В течение периода времени обработки открывается окно. Иногда обработка завершается с ошибкой, но это окно не закрыто, поэтому мы не можем получить результат. Цель этого теста — получить результат. Я пытаюсь установить тайм-аут для этого окна, поэтому оно должно быть закрыто по истечении заданного времени (сейчас я установил его на 10 секунд.), WebDriver и форма должна быть повторно отправлена. Я использую следующий код.

 WebElement webElement;
try {
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    driver.findElement(sendButton).click();
    webElement = wait.until(ExpectedConditions.presenceOfElementLocated(By.className("button-resultdown")));
} catch (TimeoutException ex) {
    webElement = null;
} finally {
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
}
if (webElement == null) {
    driver.findElement(popUpClose).click();
    TimeUnit.SECONDS.sleep(4);
    driver.findElement(sendButton).click();
}
  

Всплывающее окно не закрывается автоматически через 10 секунд. Я проверил локаторы элементов, они действительны.

Ответ №1:

Рекомендуется не использовать явные и неявные ожидания в одно и то же время, подробнее здесь .
Для закрытия всплывающего окна вы можете попробовать щелкнуть с помощью JavaScript или подождать, пока popUpClose оно станет интерактивным.

 JavascriptExecutor js = (JavascriptExecutor) driver;

driver.findElement(sendButton).click();

List<WebElement> elements = waitElements(driver, 5, By.className("button-resultdown"));
if (elements.size() == 0){
    List<WebElement> popUpCloseButtons = driver.findElements(popUpClose);
    System.out.println("Popup Close Buttons size: "   popUpCloseButtons.size());
    if (popUpCloseButtons.size() > 0)
        js.executeScript("arguments[0].click();", popUpCloseButtons.get(popUpCloseButtons.size() - 1));
        //popUpCloseButtons.get(popUpCloseButtons.size() - 1).click();
}
  

И пользовательский метод ожидания:

 public List<WebElement> waitElements(WebDriver driver, int timeout, By locator) throws InterruptedException {
    List<WebElement> elements = new ArrayList<>();
    for (int i = 0; i < timeout; i  ) {
        elements = driver.findElements(locator);
        if (elements.size() > 0)
            break;

        System.out.println("Not!");
        Thread.sleep(1000);
    }

    return elements;
}
  

Комментарии:

1. Спасибо, но как я могу определить значение «тайм-аута», когда окно должно быть закрыто WebDriver?

2. Я должен подождать заданное время и после этого нажать кнопку закрытия, а затем дождаться исчезновения окна. Итак, этот код пропустил первый шаг, ожидая предопределенного времени (10 секунд). Кнопка доступна при загрузке страницы, поэтому это не очень хорошее условие.

3. Предопределенное время, которое вы можете установить в WebDriverWait wait = new WebDriverWait(driver, 10); . if (elements == null) если результата нет, нажмите кнопку закрыть. А затем подождите, пока invisibilityOfElementLocated не будет установлено предопределенное время ожидания, установленное для явного ожидания. Если вы хотите нажимать, пока всплывающее окно не будет закрыто, вы также можете поместить его в цикл

4. Я пробовал ваш код, но он не работает, не имеет никакого эффекта. Я ExpectedConditions.invisibilityOfElementLocated тоже пытался использовать, но TimeoutException через 10 секунд получил, а всплывающее окно все еще открыто.

5. Проверьте обновленный код. Также проверьте, есть ли в DOM более одной кнопки popUpClose