Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Как проверить что кнопка дизейблиться сразу после сабмита?

javascript
webdriver
java
Теги: #<Tag:0x00007f7b630a7158> #<Tag:0x00007f7b630a6fa0> #<Tag:0x00007f7b630a6e38>

(Rouslan Toukhvatoullin) #1

Привет! Собственно есть кнопка, которая по событию клик дизейблит саму себя и другие кнопки, и потом сразу же сабмитит форму. Соответственно открывается новая страница. Но если отчет большой, то новая страница открывается не сразу, и в этот момент кнопки все еще доступны для пользователя.
Вопрос: как проверить что кнопки дизейбляьтся прямо перед загрузкой новой страницы?
Такая же ситуация описана здесь http://stackoverflow.com/questions/14491608/selenium-test-disable-on-submit-behavior , но ничего не прокатывает пока. Руками я успеваю проверить кнопку, а скрипт не успевает.
Думаю может инжектнуть свой клик-листенер на кнопку, который стопанет загрузку страниц… или что-то в этом духе.
Может кто сталкивался? Собственно java + webdriver.


(Евгений Салмин) #2

Использовать wait от Селениум, ждать свойства isEnabled=false, или что-то вроде. Должно работать.


(Sergey Korol) #3

WDWait + custom ExpectedCondition?

wait.until((WebDriver driver) -> !findElement(locator).isEnabled())

(Rouslan Toukhvatoullin) #4

дело в том, что кнопка сабмитит форму, и соответственно перезагружает страницу, а на новой странице уже нет этой кнопки, и локатор её не находит


(Евгений Салмин) #5

Как нет кнопки?:slight_smile: а что мы тогда проверяем? Если юзается PageObject - надо искать заново, driver.findElement.


(Rouslan Toukhvatoullin) #6

попробую объяснить еще раз:
кнопку нажимаю - форма сабмитится и открывается новая страница.
на новой странице этой кнопки уже нет.
но есть короткий момент между нажатием кнопки и открытием новой страницы. в этот самый короткий момент пользователь может успеть еще раз нажать кнопку.
в этот момент кнопка должна быть задисейблена, вот это и надо проверить.
руками проверяется легко, а скриптом проверить не получается


(Rouslan Toukhvatoullin) #8

В общем, решил вопрос, если кому интересно.
Кто-то здесь мне предлагал нажимать эскейп сразу после нажатия на сабмит, чтобы не дать браузеру загрузить следующую страницу и прочекать новые элементы на этой же странице.
Перепробовал варианты с 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);

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


(Nik Sidorenko) #9

Как вариант можно попробовать поменять PAGE_LOAD_STRATEGY драйвера.

DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PAGE_LOAD_STRATEGY, "none");

По-умолчанию, у драйвера установлено “normal”. Это означает если что-то приводит к перезагрузке страницы или открытию новой страницы (например, клин по кнопки), то драйвер ждёт пока страница загрузится и только потом разрешает с ней взаимодействовать. Если установить “none”, то драйвер не будет ждать, а сразу даст возможность что-то делать со страницей вот в этот момент можно и попробовать проверить состояние кнопки.

Сразу оговорюсь, что сам с этой штукой много не эксперементировал. Знаю только в теории.


(Rouslan Toukhvatoullin) #10

А вот это интересно, не знал. Спасибо, попробую.