#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