Проверьте самоудаляющийся / динамический Webelement в Selenium - PullRequest
0 голосов
/ 01 октября 2018

Что я делаю

Я экспериментировал с Selenium и создавал простую программу, чтобы упростить мою жизнь при тестировании Selenium.Частью этого является тестирование webelements и выяснение того, какие методы (нажав на отправку ect) заставляют их перезагружать страницу, оставаться статичными или устареть без перезагрузки страницы .В этом вопросе меня особенно интересует третий случай, так как первые два уже реализованы мной.

Проблема, с которой я сталкиваюсь

Проблема, с которой я столкнулся, заключается в нахождении Webelement, который идетустарел и не вызывает перезагрузки страницы.Я не могу придумать хороший способ поиска, у меня нет навыков работы с HTML и javascript, чтобы его создать (но в любом случае), и я не могу проверить, работает ли мой код, если я на самом деле его не тестирую.

То, что я сделал / попробовал

Первое, что я подумал, это всплывающее окно, но на самом деле это не часть веб-страницы, и они также весьма ненадежны.Я хочу что-то, что будет вести себя последовательно, потому что иначе тест не будет работать.Я думаю, что динамические Webelements, те, которые меняют свои локаторы при действии, будут соответствовать моим потребностям, но у меня нет хорошего способа их найти.Любые результаты поиска Google для "Самостоятельно удаляемый webelement exmaple" или "Webelement устаревают, не вызывает пример перезагрузки страницы" или аналогичный, будут вызывать у меня только вопросы о переполнении стека, как этот, а нечто я хочу - конкретные примеры.Код, который я запускаю, просто ждет staleReferenceException и события onload в javascript.Если staleReferenceException происходит, а событие onload - нет, тогда я знаю, что обнаружил самоуничтожающийся / динамический webelement (по крайней мере, это то, что я считаю правильным способом обнаружить это).Вот код, который я запускаю:

try {
    //wait until the element goes stale
    wait.until(ExpectedConditions.stalenessOf(webElement));
    //init the async javascript callback script
    String script = "var callback = arguments[arguments.length - 1];" +
            "var classToCall = 'SeleniumTest.isPageReloaded';" +
            "window.addEventListener('onload'," + "callback(classToCall));";
    //execute the script and wait till it returns (unless timeout exceeded)
    JavascriptExecutor js = (JavascriptExecutor) driver;
    //execute the script and return the java classname to call 
    //if/when the callback function returns normally
    String classToCall = (String) js.executeAsyncScript(script);
    clazz = Class.forName(classToCall);
    callbackMethod = clazz.getMethod("JavascriptWorking");
    callbackMethod.invoke(null,null);
    //page reloaded
    threadcase = 1;
}
//waiting until webElement becomes stale exceeded timeoutSeconds
catch (TimeoutException e) {
    //page was static
    threadcase = 2;
}
//waiting until webElement Reloaded the page exceeded timeoutSeconds
catch (ScriptTimeoutException e) {
    //the webElement became stale BUT didn't cause a page reload.
    threadcase = 3;

Как вы можете заметить выше, в этом коде есть переменная int с именем threadcase.Три «случая», начиная с 1 (0 было начальным значением, которое представляло ошибку потока программы), представляют три (без ошибок) возможных результатов этого теста:

  1. страница перезагружается
  2. страница остается статической, webelement не изменяется
  3. страница остается статичной, webelement изменяется

И мне нужен хороший пример, с помощью которого можно проверить третий случай.

Решения, которые я рассмотрел

Я провел некоторые фундаментальные исследования по удалению webelement в javascript, но IA: даже не знаю, смогу ли я так поступить на странице в Selenium и B:Я предпочел бы получить тестовый пример, который просто использует веб-страницу как есть, поскольку внесение моих изменений делает достоверность моего тестового сценария зависимой от большей части моего кода (что плохо!).Так что мне нужен хороший способ найти веб-элемент, отвечающий моим критериям, без необходимости просматривать Интернет с открытым окном f12 в надежде найти ту кнопку, которая делает то, что мне нужно.

Редактировать 1

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

Точный код, который я использовал, приведен ниже.У меня была остановка отладки в первой строке:

1   Method callbackMethod = null;
2   try {
3       //wait until the element goes stale
4       wait.until(ExpectedConditions.stalenessOf(webElement));
5       //init the async javascript callback script
6       String script = "var callback = arguments[arguments.length - 1];" +
7           "var classToCall = 'SeleniumTest.isPageReloaded';" +
8           "window.addEventListener('onload', callback(classToCall));";
9       //execute the script and wait till it returns (unless timeout 
10      //exceeded)
11      JavascriptExecutor js = (JavascriptExecutor) driver;
12      //execute the script and return the java classname to call if/when 
13      //the callback function returns normally
14      String classToCall = (String) js.executeAsyncScript(script);
15          clazz = Class.forName(classToCall);
16          callbackMethod = clazz.getMethod("JavascriptWorking");
17          callbackMethod.invoke(null,null);
18          //page reloaded
19          threadcase = 1;
20      }
21      //waiting until webElement becomes stale exceeded timeoutSeconds
22      catch (TimeoutException e) {
23          //page was static
24          threadcase = 2;
25      }
26      //waiting until webElement Reloaded the page exceeded 
27      //timeoutSeconds
28      catch (ScriptTimeoutException e) {
29          //the webElement became stale BUT didn't cause a page reload.
30          threadcase = 3;
31          //trying to get the class from javascript callback failed.
32      }

что должно произойти, это то, что устаревший webelement заставляет программу перестать ждать в строке 4, программа прогрессирует, инициализирует обратный вызов Javascript в строках 6-11, а затем в строке 14 предполагается, что вызов executeAsyncScript ДОЛЖЕН подождать, пока не произойдет событие «onload», которое должно произойти только в случае перезагрузки страницы.Прямо сейчас это не делает, или я слепой.Я, должно быть, путаю поток программ, потому что на 99% уверен, что при манипулировании DOM не происходит перезагрузки страницы, чтобы удалить веб-элемент, на который я нажимаю.

Вот URL, который я пытаюсь:

https://www.google.com/webhp?gws_rd=ssl

Простая главная страница Google, кнопка, которую я удаляю, - это кнопка приложений Google (черная 9-сетка ввверху справа)

некоторая информация об этом элементе:

class = "gb_8 gb_9c gb_R gb_g"

id = "gbwa"

Это общий контейнерэлемент для самой кнопки и раскрывающийся список, который она создает.Я удаляю это, когда моя программа достигает STOP в строке 1. Затем я прохожу свою программу в отладчике.Примечание (вам может потребоваться несколько раз нажать кнопку «осмотреть элемент» на кнопке, чтобы сфокусироваться на ней).Я собираюсь попытаться удалить элементы более низкого уровня, а не весь контейнер, и посмотреть, изменит ли это что-нибудь, но все же это поведение сбивает меня с толку.Цель здесь состоит в том, чтобы получить поток программы к потоку 3, потому что это тот, для которого мы тестируем.Не должно быть никаких перезагрузок страницы, НО webelement должен стать устаревшим после того, как я вручную удаляю это.Я понятия не имею, почему обратный вызов javascript работает, когда я не вижу перезагрузки страницы.Дайте мне знать, если вам нужна дополнительная информация о том, что именно я удаляю, на главной странице Google, и я постараюсь отправить картинку (с дополнительными кружками от руки, конечно).

1 Ответ

0 голосов
/ 01 октября 2018

Я думаю, что вы можете отладить тест, поместить точку останова в подходящую точку, а затем использовать инструменты разработчика браузеров для ручного обновления HTML.

Очевидно, если вы хотите, чтобы это было повторяемымобрабатывать это не вариант, но если вы просто исследуете, тогда может подойти ручное вмешательство

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...