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

Ветвление в selenium ide


(Kristall89) #1

Приветствую!

Чем дальше в лес, тем толще  партизаны (с). Я добралась до ветвлений.

Задача: клик по баннеру на сайте, в новой вкладке открывается страница _одного из двух_ сайтов рандомно, проверяем, что открылось что-то верное, уходим обратно к основной странице.

Мне удалось при помощи Selenium IDE FlowControl скреативить следующий вариант:

<tr>
    <td>waitForElementPresent</td>
    <td>xpath=id('BANNER-R1')/x:a/x:img</td>
    <td></td>
</tr>
<tr>
    <td>clickAndWait</td>
    <td>xpath=id('BANNER-R1')/x:a/x:img</td>
    <td></td>
</tr>
<!--Кликаем по баннеру-->
<tr>
    <td>storeEval</td>
    <td>if (selenium.isElementPresent(location='http://www.perm.ural.rt.ru/*') == true) {'http://www.perm.ural.rt.ru/'} else if (selenium.isElementPresent(location='http://www.perm.ural.rt.ru/*') == false) {'http://zabava.ru/'}</td>
    <td>verify location</td>
</tr>
<tr>
    <td>selectWindow</td>
    <td>title=Личный кабинет &quot;Ростелеком&quot;</td>
    <td></td>
</tr>

Результат превзошел все ожидания: по моему ветвлению один из заданных в баннере сайтов открывается.... В том окне, где селениум О.о И назад к селениуму откатываться не желает.

Плюс селект виндовс выполняется (выполнялся до добавления ветвления, точнее) адекватно, но на на вкладку переключался только сам селениум, в браузере оставалась открытой новая. Это нормально? И возможно ли ее (новую вкладку) вообще закрыть какой-нибудь командой?

По команде close в режиме "тыкнуть отдельно каждую команду" все ок, а при выполнении теста закрывается изначальная вкладка (сайт который собственно тестируется) и выполнение теста тормозится на ошибке.


(fiestamelky) #2

привет,

если я правильно понял проблему - то goBack или goBackAndWait тебе должны помочь


(Kristall89) #3

Нашла!

<tr>
    <td>storeEval</td>
    <td>if (selenium.getLocation('http://www.perm.ural.rt.ru/*') == true) {'http://www.perm.ural.rt.ru/'} else if (selenium.getLocation('http://www.perm.ural.rt.ru/*') == false) {'http://zabava.ru/'}</td>
    <td>verify location</td>
</tr>

Ошибок не выдает, странно себя не ведет. Идея этой конструкции: тест выясняет, какой из двух сайтов открылся. Если откроется посторонний сайт, тест упадет в ошибку. Может, и несовершенная конструкция, но я ею в каком-то смысле горжусь :)

 

Остался вопрос: а) как закрыть не ту вкладку, с которой работа идет по умолчанию, а ту, которая открылась по клику на баннер? selectWindow+close не катит :( Или как новую вкладку открыть в виде всклывающего окна? не нового в браузере, а именно всплывающего. Ссылки (не баннеры), которые должны быть в новой вкладке, у меня в селениуме открываются именно так и close отлично с их видит и закрывает...


(Kristall89) #4

Не спасает.

У меня в процессе теста открывается новая вкладка (или новое окно, если специально настроить это в браузере). close, goBack действуют _на изначальную_ вкладку, с которой работа начиналась. Новую не затрагивают. А мне нужно _закрыть_ новую и _вернуться_ к старой.


(Kristall89) #5

Дополнение. Нашла плюс-минус рабочее решение второй проблемы, буду рада, если предложат лучше. Проверка у меня разбита на несколько кейсов, в итоге следующий после того, в котором происходит переход на новую вкладку, начинается с команды open (страница, открывшаяся в новой вкладке, сменяется на изначальную). А последний кейс в плане заканчивается командой close, которая эту новую вкладку убивает.

Плюсы - все кейсы выплняются корректно, не множатся лишние вкладки.

Минусы - возможно, это все-таки извращение? Если кто-нибудь все-таки знает способ красивей - делитесь :)


(Kristall89) #6

Все-таки снова поднимаю тему. Разобралась в том, что найденный мной вариант по ветвлению не работает, т.к. getLocation возвращает не true или false, а текст url. Пока цепляюсь за элемент, который есть только на одной из двух страниц, но все же, есть ли способ сделать ветвление с проверкой именно по url?

И еще вопрос, несколько на другую тему, но к тому же тесту. Сработало ветвление, открывшийся сайт определен, и мне нужно проверить, что это действительно та страница (особенно при условии, что цепляюсь я за элемент, а не за адрес.

<tr>
    <td>waitForElementPresent</td>
    <td>xpath=id('BANNER-R1')/x:a/x:img</td>
    <td></td>
</tr>
<tr>
    <td>click</td>
    <td>xpath=id('BANNER-R1')/x:a/x:img</td>
    <td></td>
</tr>
<!--Кликаем по баннеру-->
<tr>
    <td>storeExpression</td>
    <td>http://www.perm.ural.rt.ru/*</td>
    <td>fast_internet</td>
</tr>
<tr>
    <td>storeExpression</td>
    <td>http://zabava.ru/*</td>
    <td>zabava</td>
</tr>
<tr>
    <td>pause</td>
    <td>20000</td>
    <td></td>
</tr>
<tr>
    <td>selectPopUp</td>
    <td></td>
    <td></td>
</tr>
<tr>
    <td>storeEval</td>
    <td>if (selenium.isElementPresent('class=navbar-player') == true) {nextMove = 'zabava'} else if (selenium.isElementPresent('class=navbar-player') == false) {nextMove = 'fast_internet'}</td>
    <td>nextMove</td>
</tr>
<tr>
    <td>echo</td>
    <td>${nextMove}</td>
    <td></td>
</tr>
<tr>
    <td>gotolabel</td>
    <td>${nextMove}</td>
    <td></td>
</tr>
<tr>
    <td>label</td>
    <td>fast_internet</td>
    <td></td>
</tr>
<tr>
    <td>verifyLocation</td>
    <td>http://www.perm.ural.rt.ru/*</td>
    <td></td>
</tr>

<tr>
    <td>gotolabel</td>
    <td>testingClosed</td>
    <td></td>
</tr>
<tr>
    <td>pause</td>
    <td>1000</td>
    <td></td>
</tr>
<tr>
    <td>label</td>
    <td>zabava</td>
    <td></td>
</tr>
<tr>
    <td>verifyLocation</td>
    <td>http://zabava.ru/*</td>
    <td></td>
</tr>

<tr>
    <td>gotolabel</td>
    <td>testingClosed</td>
    <td></td>
</tr>
<tr>
    <td>label</td>
    <td>testingClosed</td>
    <td></td>
</tr>

 

Проверки выделила жирным подчеркиванием.

В таком виде они не работают, т.к. проверка получается нацеленной не на открывшуюся страницу, а на изначальную, и выдает отрицательный результат, не смотря на сделанный ранее selectPopUp. selectWindow сделать не получается, т.к. title у открывшихся страниц может быть очень разным, и их сильно больше двух.Так что снова лезть в ветвления мягко говоря не хочется. Возможно ли сделать selectWindow по другому параметру или как-то иначе выбрать окно?


(Kristall89) #7
  • [info] Executing: |verifyLocation | http://www.perm.ural.rt.ru/* | |
  • [error] Actual value 'https://kabinet-test.rt.ru/' did not match 'http://www.perm.ural.rt.ru/*'

Ошибка из лога. Т.е. действительно сравнивает заданный url не с тем, с которым ожидается.


(Mykhailo Poliarush) #8

вопрос, а не проще ли сделать подобный тест на нормальном языке программирования и непариться с такими проблемами?


(Kristall89) #9

Нет, к сожалению, не проще.

Для этого надо как минимум знать хоть один язык, не поверите.


(Mykhailo Poliarush) #10

а все эти сайты доступны из интернета?

если да, то приложите весь тест, чтобы его можно было прогнать и посмотреть, что происходит


(vmaximv) #11

У вас по-прежнему страницы открываются в табах? Если да, настраивайте браузер - Selenium не может работать с табами.

 


(Kristall89) #12

Открытие в новом окне проблемы не решило. Ни одной из двух.


(vmaximv) #13

У меня работает:

 

<tr>
<td>open</td>
<td>/</td>
<td></td>
</tr>
<tr>
<td>storeTitle</td>
<td>title</td>
<td></td>
</tr>
<tr>
<td>echo</td>
<td>${title}</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>xpath=//*[@id='BANNER-R1']/a</td>
<td></td>
</tr>
<tr>
<td>waitForPopUp</td>
<td></td>
<td></td>
</tr>
<tr>
<td>selectPopUp</td>
<td></td>
<td></td>
</tr>
<tr>
<td>storeTitle</td>
<td>title</td>
<td></td>
</tr>
<tr>
<td>echo</td>
<td>${title}</td>
<td></td>
</tr>

Output:

 

  • [info] Executing: |open | / | |
  • [info] Executing: |storeTitle | title | |
  • [info] Executing: |echo | ${title} | |
  • [info] echo: Личный кабинет "Ростелеком"
  • [info] Executing: |click | xpath=//*[@id='BANNER-R1']/a | |
  • [warn] Link has target '_blank', which is not supported in Selenium! Randomizing target to be: selenium_blank93780
  • [info] Executing: |waitForPopUp | | |
  • [info] Executing: |selectPopUp | | |
  • [info] Executing: |storeTitle | title | |
  • [info] Executing: |echo | ${title} | |
  • [info] echo: Кабинет участника бонусной программы » ОАО "Ростелеком"

(Kristall89) #14

Спасибо, проверю у себя.