Перейти к содержимому

Фотография

SeleniumIDE - проблема с оператором IF


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 11

#1 Лелик32

Лелик32

    Постоянный участник

  • Members
  • PipPipPip
  • 235 сообщений

Отправлено 26 декабря 2011 - 15:30

Добрый день!

Встала следующая задача: если пользователь авторизирован на сайте, то сделать лог аут. Для решения задачи прочитал вот эту статью, в которой как раз дан неплохой пример реализации через оператор IF (для этого используется внешнее расширение). Все вроде сделал правильно, но при попыке запустить тест вываливается следующая ошибка:

[info] Executing: |storeEval | if (selenium.isElementPresent('link=New Account') == false) {nextMove='LogOut')} | nextMove |
[error] Threw an exception: missing ; before statement

Сам тест:

<tr><td>open</td>
<td>http://site.com/</td>
<td></td></tr>
<tr><td>storeExpression</td>
<td>http://site.com/</td>
<td>mainPage</td></tr>
<tr><td>waitForPageToLoad</td>
<td></td>
<td>6000</td></tr>
<tr><td>assertLocation</td>
<td>${mainPage}</td>
<td></td></tr>
<tr><td>assertTitle</td>
<td>Site Name</td>
<td></td></tr>
<!--Ищем элемент link=New Account и принимаем решение о следующем шаге-->
<tr><td>storeEval</td>
<td>if (selenium.isElementPresent('link=New Account') == false) {nextMove='LogOut')}</td>
<td>nextMove</td></tr>
<tr><td>echo</td>
<td>${nextMove}</td>
<td></td></tr>
<!--Двигаемся согласно результату в nextMove-->
<tr><td>gotolabel</td>
<td>${nextMove}</td>
<td></td></tr>
<!--Отрабатываем положительный результат теста-->
<tr><td>label</td>
<td>LogOut</td>
<td></td></tr>
<tr><td>clickAndWait</td>
<td>id=fp_logout</td>
<td></td></tr>
<tr><td>assertTitle</td>
<td>Site Name</td>
<td></td></tr>
<tr><td>click</td>
<td>css=div.link.login &gt; span.link-text</td>
<td></td></tr>
<tr><td>type</td>
<td>id=fp_username</td>
<td>user</td></tr>
<tr><td>type</td>
<td>id=fp_password</td>
<td>123456</td></tr>
<tr><td>clickAndWait</td>
<td>id=fp_login</td>
<td></td></tr>
<tr><td>waitForPageToLoad</td>
<td></td>
<td>6000</td></tr>
<tr><td>assertTextPresent</td>
<td></td>
<td>user</td></tr>
<tr><td>assertTextPresent</td>
<td></td>
<td>link=/user/</td></tr>
<tr><td>assertTextPresent</td>
<td></td>
<td>My Sites</td></tr>
<tr><td>assertTextPresent</td>
<td></td>
<td>link=/user/edit-profile/</td></tr>
<tr><td>assertTextPresent</td>
<td></td>
<td>Profile</td></tr>
<tr><td>assertTextPresent</td>
<td></td>
<td>link=/user/fav/</td></tr>
<tr><td>assertTextPresent</td>
<td></td>
<td>Favorites</td></tr>
<tr><td>assertTextPresent</td>
<td></td>
<td>link=/user/feedback</td></tr>
<tr><td>assertTextPresent</td>
<td></td>
<td>Feedback</td></tr>
<tr><td>assertElementPresent</td>
<td>identifier=fp_logout</td>
<td></td></tr>
</tbody></table>
</body>
</html>

  • 0

#2 astenix

astenix

    Специалист

  • Members
  • PipPipPipPipPip
  • 906 сообщений
  • ФИО:Лёша Лупан
  • Город:Кишинев


Отправлено 26 декабря 2011 - 15:42

Встала следующая задача:

[info] Executing: |storeEval | if (selenium.isElementPresent('link=New Account') == false) {nextMove='LogOut')} | nextMove |
[error] Threw an exception: missing ; before statement


Ну дык у вас лишняя закрывающая скобка.

Так будет правильно:

if (selenium.isElementPresent('link=New Account') == false) {nextMove='LogOut'}

  • 0

Software Testing Glossary - простыми словами о непростых словах.


#3 astenix

astenix

    Специалист

  • Members
  • PipPipPipPipPip
  • 906 сообщений
  • ФИО:Лёша Лупан
  • Город:Кишинев


Отправлено 26 декабря 2011 - 15:51

Снова Встала следующая задача

У вас код слегка требует очень сильного порядка:
  • для waitForPageToLoad время прописывайте в поле Target, а не в поле Value.
  • незачем сперва открывать сайт, а потом сохранять его url в переменную. Сразу объявите переменную (если она нужна, к слову).
  • assertTitle после открытия страниц не всегда нужен, это может быть избыточной проверкой.
  • у вас указано, что делать если на странице нет линка 'New Account', но не указано что делать, если такой линк будет присутствовать. Скрипт к этим делам будет глух, и просто побежит по шагам, которые ему будут предложены.
  • команда clickAndWait не должна соседствовать с командой waitForPageToLoad, ибо clickAndWait как раз предполагает, что после клика селениум будет ждать, пока страница полностью загрузится. А у вас получается, что селениум после полной загрузки страницы еще раз должен подождать, пока страница загрузится - анбеливыбыл.
  • assertTextPresent и link=/user/edit-profile/ - это некорректно, бо тут должно работать assertElementPresent, а не Text.

  • 0

Software Testing Glossary - простыми словами о непростых словах.


#4 Лелик32

Лелик32

    Постоянный участник

  • Members
  • PipPipPip
  • 235 сообщений

Отправлено 27 декабря 2011 - 06:05

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

И еще вопрос, зачем использовать 'echo'? В PHP, к примеру, 'echo' служит для вывода строки.

Насчет замечаний спасибо, я пока просто учюсь + эскперементирую, поэтому вот такой некрасивый код.


P.S.: у вас замечательный блог, много полезной информации.
  • 0

#5 astenix

astenix

    Специалист

  • Members
  • PipPipPipPipPip
  • 906 сообщений
  • ФИО:Лёша Лупан
  • Город:Кишинев


Отправлено 27 декабря 2011 - 09:58

И еще вопрос, зачем использовать 'echo'? В PHP, к примеру, 'echo' служит для вывода строки.

Эхо выводит в лог содержимое переменной, и нужно только для ориентирования меня в ситуации. В быту эхо можно не использовать.
  • 0

Software Testing Glossary - простыми словами о непростых словах.


#6 ESeregina

ESeregina

    Новый участник

  • Members
  • Pip
  • 15 сообщений
  • ФИО:Серегина Екатерина
  • Город:Москва

Отправлено 03 мая 2012 - 10:06

У меня небольшой вопрос так же по IFу.

Мне нужно при присутствии элемента на странице уменьшить величину переменной на 1. Может я что-то не понимаю, но всегда возвращается null :cray:

Код:
[info] Executing: |storeExpression | 4 | myVar |
[info] Executing: |storeEval | if (selenium.isElementPresent('id=TX100_A349083-3232-62575-40525-997758') == true) {myVar=${myVar} -1} | myVar |
[info] script is: if (selenium.isElementPresent('id=TX100_A349083-3232-62575-40525-997758') == true) {myVar=4 -1}
[info] Executing: |echo | Объектов по факту - ${myVar} | |
[info] echo: Объектов по факту - null

Что может быть не так? ведь в конце строки "script is:" стоит myVar=4 -1. Почему он возвращает null ???

Может знает кто-нибудь....Заранее спасибо!

Через {storedVars['myVar']=${myVar} -1} тоже не работает...

Сообщение отредактировал ESeregina: 03 мая 2012 - 10:37

  • 0

#7 psihozik

psihozik

    Новый участник

  • Members
  • Pip
  • 39 сообщений

Отправлено 03 мая 2012 - 11:39

Через {storedVars['myVar']=${myVar} -1} тоже не работает...

Попробуйте myVar = storedVars['myVar']-1, и не используйте в теле ява-скрипта ${myVar} - это не правильно
  • 1

#8 ESeregina

ESeregina

    Новый участник

  • Members
  • Pip
  • 15 сообщений
  • ФИО:Серегина Екатерина
  • Город:Москва

Отправлено 03 мая 2012 - 11:58

Как Вы написали использовать не совсем правильно я думаю тоже... Потому что он работает как со строкой с переменной и делает конкатенацию и ответ выходит 43
  • 0

#9 psihozik

psihozik

    Новый участник

  • Members
  • Pip
  • 39 сообщений

Отправлено 03 мая 2012 - 12:09

Как Вы написали использовать не совсем правильно я думаю тоже... Потому что он работает как со строкой с переменной и делает конкатенацию и ответ выходит 43

Вы правы, хотя знак "-" мог и переделать строку в число.

Я обычно задаю переменные так:
storeEval | myVar=4 | myVar

Если делать так то проблем не будет:

myVar= myVar-1

Если переменную задавать другим способом, то переделать в число можно так:
myVar = storedVars['myVar']*1
  • 1

#10 ESeregina

ESeregina

    Новый участник

  • Members
  • Pip
  • 15 сообщений
  • ФИО:Серегина Екатерина
  • Город:Москва

Отправлено 03 мая 2012 - 12:09

Большое Вам человеческое спасибо! :)
  • 0

#11 astenix

astenix

    Специалист

  • Members
  • PipPipPipPipPip
  • 906 сообщений
  • ФИО:Лёша Лупан
  • Город:Кишинев


Отправлено 03 мая 2012 - 13:29

Я обычно задаю переменные так:
storeEval | myVar=4 | myVar

Зачем именно так? :)

storeEval - это же сохранение результата работы жс-скрипта, а в вашем случае речь идет только о том, чтобы "положить циферку 4 в переменную myVar"

Проще:

storeExpression | 4 | myVar
echo | variable 'myVar' = ${myVar} |

увидите в логе "[info] echo: variable 'myVar' = 4"
  • 0

Software Testing Glossary - простыми словами о непростых словах.


#12 psihozik

psihozik

    Новый участник

  • Members
  • Pip
  • 39 сообщений

Отправлено 03 мая 2012 - 13:50


Я обычно задаю переменные так:
storeEval | myVar=4 | myVar

Зачем именно так? :)

storeEval - это же сохранение результата работы жс-скрипта, а в вашем случае речь идет только о том, чтобы "положить циферку 4 в переменную myVar"

Проще:

storeExpression | 4 | myVar
echo | variable 'myVar' = ${myVar} |

увидите в логе "[info] echo: variable 'myVar' = 4"


Обычно, если я задаю переменную, то потом прихоится с ней работать в JS(циклы, IF', и т. д.), даже если я сначала не планировал. Например: я сначала сделал скрипт авторизации, а потом когда тестовых пользователей у меня стало 3, я переделал скрипт так, чтоб я мог выбирать каким пользователем заходить и т.д. Поэтому задание переменной через JS вошло в привычку. Особо не мешает, но потом не приходится переделывать store в storeEval. И в место echo, все чаще использую getEval | alert(myVars) :)
  • 0


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных