Что я делаю
Я делал полезный метод, чтобы помочь мне найти и правильно ждать Webelements в Selenium. пока все идет хорошо, и у меня есть способ попробовать все виды различных локаторов, подождать, пока веб-элемент не будет найден, и затем ждать, пока веб-элемент не будет отображен / включен, все с таймаутами и такими приятными вещами.
В чем проблема?
Проблема в том, что мне иногда нужно найти Webelements после перезагрузки страниц. Я прочитал о доступных решениях проблемы «устаревания» и знаю, как ее решить (используя старый веб-элемент, который я только что нашел и нажал, я подожду, пока он не устареет, прежде чем снова искать) НО Я не хочу вручную проверять, приводит ли данный веб-элемент к перезагрузке страницы. Я попытался заглянуть в класс Webelement и ожидаемые условия, чтобы узнать, существует ли какой-либо метод, который возвращает true, если данный webelement вызывает перезагрузку страницы. Я попытался найти об этом здесь и в Google, и не получил ничего полезного. Я хотел знать, возможно ли иметь что-то подобное:
Boolean causesPageReload = webElement.causesPageReload;
С некоторым воображаемым методом с именем causesPageReload
, который определяет, вызывает ли веб-элемент перезагрузку страницы, когда на нее нажимают, отправляют и т. Д. Я знаю, что некоторые webelements просто вызывают запуск javascript на странице, а другие перезагружают страницу, но если бы я мог программно определить, перезагружает ли она страницу, я мог бы просто сказать:
if (causesPageReload){
wait.until(ExpectedConditions.stalenessOf("insert old webelement here"));
}
И решить проблему. Есть ли что-то в базовом HTML, javascript или, может быть, что-то уже встроенное, что может предоставить эту информацию? Конечно, я могу вручную выполнить все шаги и посмотреть, какие тестируемые веб-элементы действительно вызывают обновление страницы, но это может быть изменено, подвержено человеческим ошибкам, а также отнимает много времени.
Возможные альтернативы?
В качестве альтернативы, я мог бы просто выполнить проверку на устаревание с тайм-аутом в десять секунд, а затем, если он перезагрузит страницу, это нормально, но если этого не произойдет, то для javascript будет 10 секунд или что-то еще, чтобы завершить то, что он делает. (Мне также было любопытно, если бы мне нужно было подождать, пока не будут перезагружаться страницы, клики webelement, но это кажется сложнее из-за javascript и влечет за собой другой вопрос) Я не знаю, нужно ли мне ждать, если страница не собирается перезагрузить. даже если бы я знал, что мне нужно ждать в случае без перезагрузки, я бы не знал, как это сделать. Мои текущие ожидания просто ждут, пока webelement будет найден, отображен и активирован, поэтому, если щелкнуть по нему, произойдет что-то важное (что мне нужно ждать), но не изменит эти вещи, мне нужно что-то еще, но это требует другого вопроса быть более глубоким.
Tl: Dr
Мне просто нужно знать, могу ли я узнать, какие веб-элементы вызывают программную перезагрузку страниц, и если я не могу, то есть ли необходимость ждать неперегрузочных (нет необходимости подробно разбираться во втором случае просто скажите мне, как задать второй вопрос позже)?
Обновление
Я пробовал многопоточность, и до сих пор я получил что-то, что может (своевременно) решить, будет ли данный элемент задан при изменении DOM или нет. Это охватывает большинство случаев перезагрузки страницы, но может привести к ложному положительному результату, так как я почти уверен, что есть другие случаи, когда ссылки на элементы устаревают, не включая перезагрузку страницы. Я думаю, что коренная причина проблемы в том, что нет данных / флагов / хуков, за которые можно ухватиться, чтобы действительно сказать. Я полагаю, что лучший хук приведет к лучшему решению, но я понятия не имею, каким будет этот хук. С другой стороны, я выучил / познакомился со многопоточностью, что хорошо, потому что это область, в которой я был слаб. совместить это с моим многопоточным подходом. Как только я получу хороший хук, все, что мне нужно изменить, это вызов ExpectedConditions для объекта ожидания WebDriverwait.
Обновление 2
Я нашел этот сайт:https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
Какие сведения о событиях «load» и «DOMcontentloaded».Две вещи в JavaScript, которые запускаются, когда страницы загружаются / перезагружаются.Я уже создал потоковое приложение с ExpectedConditions следующим образом:
WebDriverWait wait = new WebDriverWait(driver,timeoutSeconds);
try{
wait.until(ExpectedConditions.stalenessOf(webElement));
}
catch (TimeoutException e){
}
Таким образом, я почти уверен, что могу изменить строку wait.until, чтобы проверить наличие события javascript с тайм-аутом, используя Java для Javascriptинтерфейс.Чтобы использовать два языка вместе, меня привели к следующему вопросу:
Как я могу использовать JavaScript в Java?
Чтобы получить знания о том, как это в основном работает.Я собираюсь попытаться реализовать это, используя Nashorn или, возможно, какой-то другой интерфейс, в зависимости от того, что лучше.
Что это потенциально означает
Хотя это не определяет для нас, является ли данный веб-элемент причиной перезагрузки страницы ДО того, как он на самом деле «попытается», он определяет это просто «пытаясь» веб-элемент.И, поскольку я использовал поток вне main, моя проверка «нет, он не перезагрузил страницу» фактически является просто условием тайм-аута, которое может быть настроено по мере необходимости.Я не думаю, что возможно определить, вызывает ли Webelement перезагрузку страницы, фактически не пытаясь это сделать, но, по крайней мере, мы можем попробовать это, определить, перезагружается ли она в течение периода ожидания, и тогда мы будем знать, что мы будем ждать достаточно долго, чтобыне получить никаких исключений устаревших ссылок при поиске того же или следующего элемента, если мы по крайней мере знаем, что следующий элемент, который мы ищем, существует на новой странице (при условии, что, как только мы выполним метод, чтобы попытаться найти его, он ждетчтобы указанный элемент отображался и выбирался, но я уже сделал это).Это также позволяет нам определить, был ли данный веб-элемент удален со страницы, «попробовав его», потому что если мы объединим вызов загрузки страницы javascript с проверкой устаревшей ссылки, которая у меня уже есть, то мы можем использовать условие «событие загрузки JS didn»t fire (page static), НО исключение устаревших ссылок было выброшено (элемент DOM изменен), поскольку проверка «этот элемент был значительно удален / изменен, но страница не была перезагружена», что является довольно полезной информацией.Кроме того, поскольку эти элементы теперь можно сгруппировать по трем категориям:
- Не удаляется, может ссылаться снова
- Удалено, но страница статическая
- Удалено, но изменения страницы
Мы можем сохранить результаты заранее и (пока локаторы остаются нетронутыми) мы можем легче узнать, нужно ли нам ждать или нет после нажатия на веб-элемент.Мы могли бы даже пойти дальше и, если мы знаем, что у нас есть 2-й случай, мы можем повторить поиск элемента и посмотреть, меняются ли его локаторы или нет, когда мы щелкаем по нему, так как я думаю, что исключения исключительной ситуации могут быть выданы без необходимости изменения всех локаторов.Насколько это полезно?Я не уверен, но я думаю, что это довольно полезный материал, но почему-то я не думаю, что я первый, кто попытается найти решение для этого.Я опубликую ответ, когда я успешно осуществлю и протестирую это, но это будет некоторое время, потому что мне нужно выучить некоторый основной Javascript и затем, как интегрировать это с моим java.