Привет! Собственно есть кнопка, которая по событию клик дизейблит саму себя и другие кнопки, и потом сразу же сабмитит форму. Соответственно открывается новая страница. Но если отчет большой, то новая страница открывается не сразу, и в этот момент кнопки все еще доступны для пользователя.
Вопрос: как проверить что кнопки дизейбляьтся прямо перед загрузкой новой страницы?
Такая же ситуация описана здесь webdriver - selenium: test "disable on submit" behavior - Stack Overflow , но ничего не прокатывает пока. Руками я успеваю проверить кнопку, а скрипт не успевает.
Думаю может инжектнуть свой клик-листенер на кнопку, который стопанет загрузку страниц… или что-то в этом духе.
Может кто сталкивался? Собственно java + webdriver.
Использовать wait от Селениум, ждать свойства isEnabled=false, или что-то вроде. Должно работать.
WDWait
+ custom ExpectedCondition
?
wait.until((WebDriver driver) -> !findElement(locator).isEnabled())
дело в том, что кнопка сабмитит форму, и соответственно перезагружает страницу, а на новой странице уже нет этой кнопки, и локатор её не находит
Как нет кнопки? а что мы тогда проверяем? Если юзается PageObject - надо искать заново, driver.findElement.
попробую объяснить еще раз:
кнопку нажимаю - форма сабмитится и открывается новая страница.
на новой странице этой кнопки уже нет.
но есть короткий момент между нажатием кнопки и открытием новой страницы. в этот самый короткий момент пользователь может успеть еще раз нажать кнопку.
в этот момент кнопка должна быть задисейблена, вот это и надо проверить.
руками проверяется легко, а скриптом проверить не получается
В общем, решил вопрос, если кому интересно.
Кто-то здесь мне предлагал нажимать эскейп сразу после нажатия на сабмит, чтобы не дать браузеру загрузить следующую страницу и прочекать новые элементы на этой же странице.
Перепробовал варианты с Sendkeys и actions.perform. вебдрайвер после нажатия на кнопку сабмит не успевает нажать на кнопку эскейп либо теряет контекст.
Решил делать это джаваскриптом.
WebDriver driver = SeleniumCore.driver;
JavascriptExecutor js = (JavascriptExecutor) driver;
String script = "document.getElementsByName(\"" + buttonName
+ "\")[0].addEventListener(\"click\",function() { window.stop();});";
js.executeScript(script);
добавляем евент который останавливает браузер сразу после нажатия кнопки. Так как к этому моменту практически все остальные скрипты привязанные к сабмиту отработали и на странице появились нужные элементы, то мы можем их прочекать, а сама кнопка задисейблилась что тоже чекаем.
дальше либо просто рефрешим браузер, либо также скриптом убираем этот евентлистенер и сабмитим форму.
Как вариант можно попробовать поменять PAGE_LOAD_STRATEGY драйвера.
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PAGE_LOAD_STRATEGY, "none");
По-умолчанию, у драйвера установлено “normal”. Это означает если что-то приводит к перезагрузке страницы или открытию новой страницы (например, клин по кнопки), то драйвер ждёт пока страница загрузится и только потом разрешает с ней взаимодействовать. Если установить “none”, то драйвер не будет ждать, а сразу даст возможность что-то делать со страницей вот в этот момент можно и попробовать проверить состояние кнопки.
Сразу оговорюсь, что сам с этой штукой много не эксперементировал. Знаю только в теории.
А вот это интересно, не знал. Спасибо, попробую.