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

Фотография

Тестирование drop-down lists при помощи Selenium


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

#1 Dary

Dary

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • ФИО:даша

Отправлено 17 сентября 2010 - 13:09

Здравствуйте!
Подскажите пожалуйста, как автоматизировать проход по выпадающему списку, содержащему тыщи записей?

Алгоритм примерно таков:
- открыть список, выбрать первый элемент
- нажать кнопку Search
- проверить, что появился какой-то результат
- открыть список, выбрать второй элемент
- нажать кнопку Search
и так далее

То есть нужен цикл. Selenium IDE конечно здорово, но он так не умеет. Ему нужно название каждого элемента списка:

selenium.select("dd_ID", "label=ELEMENT_NAME");
selenium.waitForPageToLoad("30000");
selenium.click("btnSearch");
selenium.waitForPageToLoad("30000");

Я новичок в автоматизации, познания в программировании самые что ни на есть базовые, вчера впервые запустила свой первый тест в Eclipse :)
В общем, люди добрые, не закидывайте помидорами, помогите?

Прикрепленные файлы

  • Прикрепленный файл  drop_down.png   15,97К   81 Количество загрузок:

  • 0

#2 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 17 сентября 2010 - 14:18

Здравствуйте!
Подскажите пожалуйста, как автоматизировать проход по выпадающему списку, содержащему тыщи записей?

Алгоритм примерно таков:
- открыть список, выбрать первый элемент
- нажать кнопку Search
- проверить, что появился какой-то результат
- открыть список, выбрать второй элемент
- нажать кнопку Search
и так далее

То есть нужен цикл. Selenium IDE конечно здорово, но он так не умеет. Ему нужно название каждого элемента списка:

selenium.select("dd_ID", "label=ELEMENT_NAME");
selenium.waitForPageToLoad("30000");
selenium.click("btnSearch");
selenium.waitForPageToLoad("30000");

Я новичок в автоматизации, познания в программировании самые что ни на есть базовые, вчера впервые запустила свой первый тест в Eclipse :)
В общем, люди добрые, не закидывайте помидорами, помогите?

Тут без циклов не обойтись. Даже если трудно выбрать элемент по тексту, то его можно выбирать по индексу. Но для ИДЕ это тоже не решение.
Для подобных сценариев вам лучше воспользоваться Selenium-RC.
  • 0

#3 Dary

Dary

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • ФИО:даша

Отправлено 18 сентября 2010 - 18:26

Тут без циклов не обойтись. Даже если трудно выбрать элемент по тексту, то его можно выбирать по индексу. Но для ИДЕ это тоже не решение.
Для подобных сценариев вам лучше воспользоваться Selenium-RC.


Вы имеете в виду по ID?
У всех элементов одного дроп-дауна он одинаковый, отличаются лишь именами. Когда-то давно я автоматизировала тестирование выпадающих списков командами, эмулирующими нажатие кнопки DOWN. Но язык Java(а команды selenium и подавно) мне незнаком, может подскажите, какая именно команда нужна для выполнения прохода по дроп-даунам? Наверняка же есть?
  • 0

#4 contestar

contestar

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

  • Members
  • Pip
  • 36 сообщений
  • ФИО:Алексей

Отправлено 18 сентября 2010 - 21:47

Допустим, все записи в дропдаун листе имеет такой вид:
//div/span[@label='item1']
//div/span[@label='item2']
Отличаются только лейблами.

можно выбрать элемент так:
selenium.click("//div/span[1]");  //Будет выбран 1-й элемент в списке
selenium.click("//div/span[2]");  //Будет выбран 2-й элемент в списке

  • 0

#5 Dary

Dary

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • ФИО:даша

Отправлено 20 сентября 2010 - 05:22

Допустим, все записи в дропдаун листе имеет такой вид:

//div/span[@label='item1']
//div/span[@label='item2']
Отличаются только лейблами.

можно выбрать элемент так:
selenium.click("//div/span[1]");  //Будет выбран 1-й элемент в списке
selenium.click("//div/span[2]");  //Будет выбран 2-й элемент в списке



HTML моего дропдауна выглядит вот так:

<select name="ddObjectType" onchange="javascript:setTimeout('__doPostBack(\'ddObjectType\',\'\')', 0)" language="javascript" id="ddObjectType">
<option selected="selected" value=""></option>
<option value="ABB_VOIP_Number">ABB - VOIP Number</option>
<option value="ABB_VoIP_Option">ABB - VoIP Option</option>
<option value="ABB_XDSLLine_rawcopper">ABB_XDSLLine_rawcopper</option>
....

До сих пор не разобралась, как пройтись по элементам списка, не привязываясь к их названиям, и похоже, без помощи коллективного разума разберусь ой как нескоро :help:
  • 0

#6 enki86

enki86

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

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


Отправлено 20 сентября 2010 - 06:40

Вот Вам посыл коллективного разума
ссылка

"var ol = document.getElementsByTagName('ol')[0]"
getElementsByTagName вернет кучу элементов (возможно), нам нужен первый из них с индексом [0] соответственно

Как написал коллега, contestar
selenium.click("//div/span[1]"); //Будет выбран 1-й элемент в списке
selenium.click("//div/span[2]"); //Будет выбран 2-й элемент в списке

Что здесь непонятно?
  • 0

#7 contestar

contestar

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

  • Members
  • Pip
  • 36 сообщений
  • ФИО:Алексей

Отправлено 20 сентября 2010 - 07:14

Предполагаю, что вам подойдет это:
selenium.click(dropdown); //раскрываем dropdown(локатор укажите свой)
int countItems = (selenium.getXpathCount("//select[@name='ddObjectType']/option")).intValue(); //таким образом выясним количество элементов
for (int i=1; i <= countItems; i++) { //пройдемся по каждому, начиная с первого и исключая 0
selenium.click("//select[@name='ddObjectType']/option[" + i + "]");
selenium.click(dropdown); //повторное раскрытие dropdown списка после каждого клика
Вроде так. Попробуйте, возможно потребуется немного изменить локаторы
  • 0

#8 Demetri

Demetri

    Активный участник

  • Members
  • PipPip
  • 143 сообщений
  • ФИО:Дмитрий
  • Город:Podgorica, MNE


Отправлено 20 сентября 2010 - 11:01

Перебор элементов списка:
String[] labels = selenium.getSelectOptions("ddObjectType");
for (String label : labels){
    selenium.select("ddObjectType", label);
}
Надо стараться уменьшить количество кликов и прочего, иначе Selenium ну оооооочень долго будет перебирать списки :)

PS Еще заметил, что присутствует событие на onchange - не знаю, что делает этот скрипт, но если это что-то важное, то можно сделать так:
String[] labels = selenium.getSelectOptions("ddObjectType");
for (String label : labels){
    selenium.select("ddObjectType", label);
    selenium.fireEvent("ddObjectType","change");
}

  • 1
Hi! I'm a signature virus. Copy me into your signature to help me spread.

#9 Dary

Dary

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • ФИО:даша

Отправлено 20 сентября 2010 - 11:15

Вот Вам посыл коллективного разума
ссылка

"var ol = document.getElementsByTagName('ol')[0]"
getElementsByTagName вернет кучу элементов (возможно), нам нужен первый из них с индексом [0] соответственно

Как написал коллега, contestar
selenium.click("//div/span[1]"); //Будет выбран 1-й элемент в списке
selenium.click("//div/span[2]"); //Будет выбран 2-й элемент в списке

Что здесь непонятно?


пошла по ссылке. читала, много думала.
поняла, что ничего не понимаю, скачала flow control плагин для IDE, написала такой цикл:

String loop2 = "0";
selenium.while("storedVars.loop2 < 130"); //130 взяла просто так :)
String = selenium.getEval("storedVars.loop2++");
selenium.keyPress("ddObjectType", "\\40"); //это нажатие кнопки "вниз"
selenium.keyPress("ddObjectType", "\\13"); //это нажатие кнопки "enter"
selenium.waitForPageToLoad("30000");
selenium.click("btnSearch");
selenium.waitForPageToLoad("30000");
selenium.endWhile();

И оно заработало, правда пока только в IDE.

А сейчас попробую воспроизвести грамотные варианты, предложенные contestar и Demetri
  • 0

#10 Dary

Dary

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • ФИО:даша

Отправлено 20 сентября 2010 - 11:56

Перебор элементов списка:

String[] labels = selenium.getSelectOptions("ddObjectType");
for (String label : labels){
    selenium.select("ddObjectType", label);
}
Надо стараться уменьшить количество кликов и прочего, иначе Selenium ну оооооочень долго будет перебирать списки :)

PS Еще заметил, что присутствует событие на onchange - не знаю, что делает этот скрипт, но если это что-то важное, то можно сделать так:
String[] labels = selenium.getSelectOptions("ddObjectType");
for (String label : labels){
    selenium.select("ddObjectType", label);
    selenium.fireEvent("ddObjectType","change");
}


Спасибо Вам огромное!
У меня всё шикарно заработало :good: , чего нельзя сказать о проекте, который сразу рухнул, не успели тесты дойти и до середины списка :diablo:

И вдогонку можно вопрос про Eclipse SDK:
есть ли в нём горячие клавиши для step-by-step отладки?
и как в процессе отладки смотреть за состоянием переменных?
:blush:

(дико извиняюсь за тупые вопросы, просто мне на работе не кому их задавать - я первый и единственный тестер в организации)
  • 0

#11 Demetri

Demetri

    Активный участник

  • Members
  • PipPip
  • 143 сообщений
  • ФИО:Дмитрий
  • Город:Podgorica, MNE


Отправлено 20 сентября 2010 - 12:13

...
И вдогонку можно вопрос про Eclipse SDK:
есть ли в нём горячие клавиши для step-by-step отладки? :blush:
...

Есть. Я пользуюсь связкой Eclipse+TestNG+Selenium, и там все достаточно просто: отмечаем брейк-поинты и жмем Debug As => TestNG Test
Для других тест-фреймворков (JUnit, etc) должно быть что-то похожее

PS А горячие клавиши можно подсмотреть в момент отладки из меню Run

Сообщение отредактировал Demetri: 20 сентября 2010 - 12:18

  • 0
Hi! I'm a signature virus. Copy me into your signature to help me spread.

#12 Dary

Dary

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • ФИО:даша

Отправлено 21 сентября 2010 - 09:39

Мой тест прекрасно работает, всем спасибо,
У меня получился перебор десятков дроп-даунов внутри сотен дроп-даунов. :clapping:
Но ещё хочется уточнить момент:

Если в каком-то месте цикла на определённом элементе приложение виснет, выполнение теста соответственно прерывается.
Я добавляю новый пункт в баг-реппорт, дописываю в тест исключение, чтобы он перескакивал с глючного пункта на следующий и запускаю тест снова.
Но дело в том, что тест занимает кучу времени, и в приложении много ошибок, таким образом он ещё ни разу не выполнился у меня до конца.
Есть ли способ автоматизировать обработку ошибок таких как зависания окна браузера, появляющиеся сообщения об ошибках?

Спасибо!
  • 0

#13 Demetri

Demetri

    Активный участник

  • Members
  • PipPip
  • 143 сообщений
  • ФИО:Дмитрий
  • Город:Podgorica, MNE


Отправлено 21 сентября 2010 - 09:47

...
Есть ли способ автоматизировать обработку ошибок таких как зависания окна браузера, появляющиеся сообщения об ошибках?

Спасибо!

Лучшим вариантом, конечно, будет обработка возникающих исключений: ловим исключение, обрабатываем (записываем ошибку в лог, скриншот и т.д.), а затем просто продолжаем перебор со следующего пункта
  • 0
Hi! I'm a signature virus. Copy me into your signature to help me spread.

#14 Dary

Dary

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • ФИО:даша

Отправлено 21 сентября 2010 - 11:18

Лучшим вариантом, конечно, будет обработка возникающих исключений: ловим исключение, обрабатываем (записываем ошибку в лог, скриншот и т.д.), а затем просто продолжаем перебор со следующего пункта


Xтобы научиться ловить исключения и сохранять скриншоты мне нужно время, а пока написала функцию, возвращающую обратно на страницу:
   private void PageCheck() throws Exception {
	
		boolean Text_present = selenium.isTextPresent("Этот текст должен быть на проверяемой странице");
		
			
		if (Text_present!= true)
	{
		System.out.println("!Page changed! Reloading.. ");
		selenium.open("search2.aspx");
		selenium.waitForPageToLoad("30000");
	}
	}

  • 0

#15 Dary

Dary

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • ФИО:даша

Отправлено 23 сентября 2010 - 15:35

Господа и снова здравствуйте!
Выручайте:
тестирую другой дроп-даун с таким html:
<select name="ddProperty1" id="ddProperty1" language="javascript" style="width: 200px;" onchange="__doPostBack('ddProperty1','')">

Пишу такой скрипт

		String[] labels = selenium.getSelectOptions("ddProperty1");
	for (String label : labels){
          selenium.select("ddProperty1", label);
		selenium.fireEvent("ddProperty1","change");
		selenium.waitForPageToLoad("100000");
}


он виснет на последней строке и не хочет работать дальше :'(

PS

на таком дроп-дауне скрипт работает:
<select name="ddProperty1" id="ddProperty1" style="width: 200px;" onchange="javascript:setTimeout('__doPostBack(\'ddProperty1\',\'\')', 0)">

  • 0

#16 Demetri

Demetri

    Активный участник

  • Members
  • PipPip
  • 143 сообщений
  • ФИО:Дмитрий
  • Город:Podgorica, MNE


Отправлено 23 сентября 2010 - 16:19

А при выборе пункта из этого списка точно производится перезагрузка страницы? Потому что если нет, то эта самая последняя строчка:

selenium.waitForPageToLoad("100000");
будет лишней.

Вполне возможно, что подгрузка информации будет производится, например, AJAX'ом - в таком случае надо прицепиться к какому либо элементу на странице и ожидать его появления или, наоборот, его исчезновения, если он появляется только в момент обновления.

PS Проект где-нибудь доступен в сети? Чтоб можно было посмотреть, а не гадать :)
  • 0
Hi! I'm a signature virus. Copy me into your signature to help me spread.

#17 Dary

Dary

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • ФИО:даша

Отправлено 24 сентября 2010 - 08:45

А при выборе пункта из этого списка точно производится перезагрузка страницы? Потому что если нет, то эта самая последняя строчка:

selenium.waitForPageToLoad("100000");
будет лишней.

Вполне возможно, что подгрузка информации будет производится, например, AJAX'ом - в таком случае надо прицепиться к какому либо элементу на странице и ожидать его появления или, наоборот, его исчезновения, если он появляется только в момент обновления.

PS Проект где-нибудь доступен в сети? Чтоб можно было посмотреть, а не гадать :)


К сожалению наш проект недоступен в сети (
дело не в
selenium.waitForPageToLoad("100000");
тесты почему-то вылетают на самой команде
selenium.select("ddObjectType", label);

Проверяла даже так
if (selenium.isElementPresent("ddObjectType"))
                { selenium.select("ddObjectType", label);}

Элемент находит, но мой тест всё-равно вылетает зараза!
При чём в разные моменты времени может вылететь на этой команде. Может у Вас есть опыт решения подобной проблемы?
Или может есть способ посмотреть, почему тест прервался, не выполнившись до конца.
У меня Eclipse+Selenium+JUnit.

UPD: Нашла Failure Trace
Выдаёт вот такую ошибку:

com.thoughtworks.selenium.SeleniumException: ERROR: Element ddProperty1 not found
at com.thoughtworks.selenium.HttpCommandProcessor.throwAssertionFailureExceptionOrError(HttpCommandProcessor.java:97)
at com.thoughtworks.selenium.HttpCommandProcessor.doCommand(HttpCommandProcessor.java:91)
at com.thoughtworks.selenium.DefaultSelenium.fireEvent(DefaultSelenium.java:201)

Я так понимаю, что команда Selenium.fireEvent не находит мой дроп-даун. Но ведь условие выполняется: if (selenium.isElementPresent("ddProperty1"))
Почему так происходит? :'(
  • 0

#18 Demetri

Demetri

    Активный участник

  • Members
  • PipPip
  • 143 сообщений
  • ФИО:Дмитрий
  • Город:Podgorica, MNE


Отправлено 24 сентября 2010 - 14:54

Возможно, уже при выборе пункта меню срабатывает это событие, код страницы меняется, и fireEvent уже не может найти элемент, т.к. он отсутствует. Пробуй без fireEvent - нужна она далеко не всегда.
  • 0
Hi! I'm a signature virus. Copy me into your signature to help me spread.

#19 Dary

Dary

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • ФИО:даша

Отправлено 27 сентября 2010 - 05:30

Возможно, уже при выборе пункта меню срабатывает это событие, код страницы меняется, и fireEvent уже не может найти элемент, т.к. он отсутствует. Пробуй без fireEvent - нужна она далеко не всегда.


Спасибо Вам, Demetri, за попытку помочь, я ценю это :kiss2:
Но я уже пробовала, без fireEvent - не помогает. selenium.click, selenium.select - выдают аналогичную ошибку хотя страница открыта, объект присутствует. Я полагаю, проблема в самом селениуме.
Тесты проходят до конца в одном случае из 20.

У меня идея возникла, запускать автотесты ночью раз 20 подряд, пока не будут пройдены от начала и до конца (как раз 8 часов займёт)..

Я девушка упорная, поэтому задам ещё вопрос:

Правильно ли я пишу функцию сетап:

public void setUp() throws Exception {
		
	setUp(url, "*chrome");
	
	}

Хочу запустить тесты в IE, меняю "*chrome" на “*iehta”, но тесты не могут открыть url по всей видимости из-за script error :(
Как бы обойти это недоразумение? :blush:
  • 0

#20 Demetri

Demetri

    Активный участник

  • Members
  • PipPip
  • 143 сообщений
  • ФИО:Дмитрий
  • Город:Podgorica, MNE


Отправлено 27 сентября 2010 - 06:25

...
У меня идея возникла, запускать автотесты ночью раз 20 подряд, пока не будут пройдены от начала и до конца (как раз 8 часов займёт)..
...

Это не выход :acute:

...
Правильно ли я пишу функцию сетап:

public void setUp() throws Exception {
		
	setUp(url, "*chrome");
	
	}

Хочу запустить тесты в IE, меняю "*chrome" на “*iehta”, но тесты не могут открыть url по всей видимости из-за script error :(
Как бы обойти это недоразумение? :blush:

По-моему, эти сообщения можно отключить :smile: Хотя с кроссбраузерностью я пока особо не заморачивался, работы и так хватает выше крыши :shok:
  • 0
Hi! I'm a signature virus. Copy me into your signature to help me spread.


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

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