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

Фотография

переход на WebDriver


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

#1 appmen

appmen

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 16 января 2012 - 15:13

Здравствуйте, использую селениум. Читаю в интернете заметки о том, что использовать ВебДрайвер лучше. Задался вопросом - а стоит ли переходить на ВебДрайвер? Я использую
WebDriver driver = new FirefoxDriver();
Selenium selenium = new WebDriverBackedSelenium(driver, "http://www.yoursite.com");
на оф сайте написано, что следующим шагом будет
WebDriver driver = new FirefoxDriver();
driver.get("http://www.yoursite.com");
Используя WebDriverBackedSelenium я получаю кучу готовых функций. А используя непосредственно WebDriver большую часть из них мне придётся реализовывать самому. Я понимаю, что большая часть уже готова и просто можно скопировать код и немного подправить, но я не особо силён в программировании и не уверен, что смогу сам написать снуля какую-либо функцию. Вот мне стало интересно: чем лучше ВебДрайвер. Если можно - конкретные цифры (хотя бы приблизительные) или сылку на обсуждение такого типа. Я использую Селениум и Джаву
  • 0

#2 Skuayer

Skuayer

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

  • Members
  • PipPip
  • 115 сообщений
  • ФИО:Жуков Анатолий Викторович
  • Город:Санкт-Петербург

Отправлено 16 января 2012 - 15:17

Используя WebDriverBackedSelenium я получаю кучу готовых функций. А используя непосредственно WebDriver большую часть из них мне придётся реализовывать самому.


Это вы о каких функциях говорите?
  • 0

#3 appmen

appmen

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 16 января 2012 - 15:35


Используя WebDriverBackedSelenium я получаю кучу готовых функций. А используя непосредственно WebDriver большую часть из них мне придётся реализовывать самому.


Это вы о каких функциях говорите?

waitforpagetoload
getxpathcount

это первое, что пришло в голову. Когда я начал разбираться с ВебДрайвером, то меня смутило отсутствие waitforpagetoload
  • 0

#4 Skuayer

Skuayer

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

  • Members
  • PipPip
  • 115 сообщений
  • ФИО:Жуков Анатолий Викторович
  • Город:Санкт-Петербург

Отправлено 16 января 2012 - 18:14



Используя WebDriverBackedSelenium я получаю кучу готовых функций. А используя непосредственно WebDriver большую часть из них мне придётся реализовывать самому.


Это вы о каких функциях говорите?

waitforpagetoload
getxpathcount

это первое, что пришло в голову. Когда я начал разбираться с ВебДрайвером, то меня смутило отсутствие waitforpagetoload

вы просто не разобрались до конца)

waitforpagetoload при работае с вам аяксом ничем не поможет)
в webdriver можно использовать Explicit и Implicit Waits.
http://seleniumhq.or...r_advanced.html

за место getxpathcount работает getWebElements(...).size();

не вижу, чтобы тут пришлось реализовывать самому.
  • 0

#5 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 16 января 2012 - 19:22

Небольшое сравнение Selenium RC и WebDriver можно найти здесь: Раз селениум, два селениум

1. WebDriver позволяет получать списки элементов при помощи findElements, так что теперь можно не только узнать количество элементов, удовлетворяющих некоторому XPath- или CSS-запросу (то есть узнать размер списка, см. ответ в предыдущем комментарии), но и легко организовывать итерацию по спискам элементов (то есть то, что ранее выполнялось серией тяжеловесных XPath-запросов в цикле, теперь заменяется на итерацию по списку объектов).

2. waitForPageToLoad был выброшен как неадекватный современным требованиям :)
Во-первых, WebDriver автоматически ждет загрузки страницы, если по тем или иным признакам понимает, что она (загрузка) началась. Поэтому для "классических" веб-приложений без аякса всё стало даже проще -- надо только кликать, вебдрайвер сам подождет, где нужно.
Во-вторых, даже если страница загрузилась, это еще не значит, что она отрисовалась и с ней можно работать. Потому что аякс может еще продолжать подгружать данные. Соответственно, ждать надо более сложные события -- появления элементов или изменение их свойств. И вот для этого в WebDriver появились новые средства, которых не было в Selenium RC.
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#6 appmen

appmen

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 17 января 2012 - 09:25

большое спасибо за ссылку и разъяснения. Да аджакс гадкий, буду читать матчасть. Так лень всё это читать.. :blush:
  • 0

#7 Azur

Azur

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

  • Members
  • Pip
  • 54 сообщений
  • ФИО:Александр Згнетов
  • Город:Омск

Отправлено 17 января 2012 - 12:05

Соответственно, ждать надо более сложные события -- появления элементов или изменение их свойств. И вот для этого в WebDriver появились новые средства, которых не было в Selenium RC.

А можно поподробнее, что в вебдрайвере принципиально нового и хорошего в плане работы с аяксами?
  • 0

#8 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 20 февраля 2012 - 08:05

Если кто будет на SeleniumCamp на этой неделе -- ровно про это я собираюсь рассказывать. Есть вероятность, что организаторы сделают запись.
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#9 appmen

appmen

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 20 февраля 2012 - 11:05

решил для себя иногда писать небольшие тесты с помощью ВебДрайвера, чтобы было легче перейти. Сейчас застопорился на ожиданиях...
Есть 2 типа ожиданий, которые описаны на сайте Селениума.
WebDriver driver = new FirefoxDriver();
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
  .until(new ExpectedCondition<WebElement>(){
	@Override
	public WebElement apply(WebDriver d) {
		return d.findElement(By.id("myDynamicElement"));
	}});
и
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement"));
Пытался понять зачем они мне нужны. Взял сайт, на котором есть неполный текст, а полный появляется, когда я тыкаю на ссылку "показать всё". Написал тест, который находит элемент, тыкает на ссылку, ждёт, пока текст до клика и после клика будут разными и заносит полный текст в переменную. Всё работает. Вот часть кода ожидания:
do {
                System.out.println("working");
                Thread.sleep(100);
                element = driver.findElement(By.xpath("//мой локатор"));
                phone_part1=element.getText();
            }while(phone_part.equals(phone_part1));
этот код проверяет изменение текста каждые 0,1 секунду. Этот же пример можно расширить на многие другие случаи. Очень бы хотелось, чтобы кто-то написал мне случай, для которого этот метод не подходит
  • 0

#10 LeshaL

LeshaL

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 094 сообщений
  • ФИО:Алексей Лянгузов
  • Город:Saint-Petersburg


Отправлено 20 февраля 2012 - 11:55

Вы написали 6 строчек кода, тогда как можно написать 1 при инициализации драйвера (для implicit wait). И далее забыть об этих ожиданиях в своем тестовом коде, т.к ожидание будет включено при каждом поиске элемента.
Плюс к этому зачем писать свой метод, если уже есть готовый?
  • 0
Regards,
Alexey

#11 appmen

appmen

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 20 февраля 2012 - 12:21

Вы написали 6 строчек кода, тогда как можно написать 1 при инициализации драйвера (для implicit wait). И далее забыть об этих ожиданиях в своем тестовом коде, т.к ожидание будет включено при каждом поиске элемента.
Плюс к этому зачем писать свой метод, если уже есть готовый?

ну, в примере написано, что это будет выставлять ожидание для всех элементов, а вдруг мне надо будет ждать разное время для разных элементов (чисто гепотетически :acute: ).
Если честно, я не совсем понял как работают те методы, поэтому и написал свой :blush:
  • 0

#12 D2Phoenix

D2Phoenix

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

  • Members
  • PipPipPip
  • 200 сообщений
  • ФИО:Чадюк Вадим
  • Город:Гродно


Отправлено 20 февраля 2012 - 13:34


Вы написали 6 строчек кода, тогда как можно написать 1 при инициализации драйвера (для implicit wait). И далее забыть об этих ожиданиях в своем тестовом коде, т.к ожидание будет включено при каждом поиске элемента.
Плюс к этому зачем писать свой метод, если уже есть готовый?

ну, в примере написано, что это будет выставлять ожидание для всех элементов, а вдруг мне надо будет ждать разное время для разных элементов (чисто гепотетически :acute: ).
Если честно, я не совсем понял как работают те методы, поэтому и написал свой :blush:

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
<сделали действие с ожиданием 10 сек>
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
<сделали действие с ожиданием 5 сек>
и т.д.
А вообще ставить просто один стандартный интервал ожидания (максимально допустимый), а там где необходимо что-то специфичное просто отключаете и используете эксплицитные ожидания
  • 0

#13 LeshaL

LeshaL

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 094 сообщений
  • ФИО:Алексей Лянгузов
  • Город:Saint-Petersburg


Отправлено 20 февраля 2012 - 13:53

Если честно, я не совсем понял как работают те методы, поэтому и написал свой :blush:

Там же написано как работает неочевидное (implicit) ожидание. Драйвер раз в 500мсек опрашивает модель и если элемент появился - возвращет его, если нет, то падает с exception по истечении времени ожидания. Поэтому, если у вас, например, 3 места - элемент А появляется через 5 сек, элемент Б через 2 сек, а элемент С есть сразу - то ставьте 5 и оно будет одинаково хорошо работать во всех трех случаях. При этом установка значения 5 надо сделать всего один раз и больше не трогать.

Единственно, если элемент Б или С не появлется вовсе, то драйвер будет ждать максимальное время.

Как я понял, очевидные (explicit) ожидания нужны для случаев, когда есть какие-то специфичные элементы, время ожидания которых намного дольше обычного для других. Ну по крайней мере я бы их только в этом случае использовал, больно уж они коряво выглядят в коде.
  • 0
Regards,
Alexey

#14 mzzz

mzzz

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

  • Members
  • Pip
  • 28 сообщений
  • ФИО:Ольга
  • Город:Харьков

Отправлено 24 февраля 2012 - 14:38

Как я понял, очевидные (explicit) ожидания нужны для случаев, когда есть какие-то специфичные элементы, время ожидания которых намного дольше обычного для других. Ну по крайней мере я бы их только в этом случае использовал, больно уж они коряво выглядят в коде.


driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS) без проблем работает в firefox, но если те же тесты запустить в Internet Explorer, то появляются исключения org.openqa.selenium.StaleElementReferenceException: Element is no longer valid, причем при каждом запуске тестов исключения появляются в разных местах. Насколько я понимаю, это как раз тот случай, где нужно использовать Explicit Waits. Или на самом деле проблема может быть в чем-то другом?
  • 0

#15 neman

neman

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

  • Members
  • PipPip
  • 142 сообщений
  • ФИО:Антон


Отправлено 24 февраля 2012 - 15:04

Как я понял, очевидные (explicit) ожидания нужны для случаев, когда есть какие-то специфичные элементы, время ожидания которых намного дольше обычного для других. Ну по крайней мере я бы их только в этом случае использовал, больно уж они коряво выглядят в коде.

Насколько я понимаю, если мы ждем появление элемента, то эксплицитное ожидание делает фактически то же самое, что и имплицитное. А вот если мы ожидаем специфическое изменение состояние элемента, то необходимо использовать эксплицитное ожидание, где можно указать любое условие. В частности, я лично использовал это для работы с аяксовым поиском.

На правах оффтопа. Реализовал ожидание окончания всех аякс запросов с помощью внедрения яваскрипта ("return Ajax.activeRequestCount == 0") и эксплицитного ожидания. Вроде бы у WebDriver'a есть свои методы по работе с Аяксом, кто-нибудь применял?
  • 0

#16 Wrestler

Wrestler

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

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

Отправлено 13 марта 2013 - 10:30

Всем,Привет)
Хотелось бы обратиться с вопросом.
Не могу добиться стабильности работы ожидания. Использую C# и webdriver.

Нарушается последовательность кликов.
Должен:

wait.until(ExpectedConditions.elementToBeClickable(By.Id("Link"))).click();
wait.until(ExpectedConditions.elementToBeClickable(By.Id("button1"))).click();

wait.until(ExpectedConditions.elementToBeClickable(By.Id("Link1))).click();
wait.until(ExpectedConditions.elementToBeClickable(By.Id("button1"))).click();

wait.until(ExpectedConditions.elementToBeClickable(By.Id("Link2))).click();
wait.until(ExpectedConditions.elementToBeClickable(By.Id("button1"))).click();

А он проходит рандомно:

wait.until(ExpectedConditions.elementToBeClickable(By.Id("Link"))).click();
wait.until(ExpectedConditions.elementToBeClickable(By.Id("button1"))).click();

wait.until(ExpectedConditions.elementToBeClickable(By.Id("Link9))).click();
wait.until(ExpectedConditions.elementToBeClickable(By.Id("button1"))).click();
  • 0

#17 appmen

appmen

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 13 марта 2013 - 13:37

мне кажется, что этот вопрос уже где-то был. Я ничем не могу помочь, т.к. Ц шарп не использую
  • 0

#18 tab15

tab15

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

  • Members
  • PipPip
  • 128 сообщений

Отправлено 14 марта 2013 - 08:09

Wrestler, мне в голову только приходит вариант, что элементы подгружаются с динамически выгенерованными id не в том порядке в каком вам нужно.
Например ссылка 9 подгужается быстрее чем ссылка 2 и тем самым у нее id="Link2", а не Link9 как вы ожидаете. Может быть поможет поиск элемента другим способом, не по id
  • 0

#19 owasp

owasp

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

  • Members
  • PipPip
  • 87 сообщений

Отправлено 17 марта 2013 - 06:29

Всем,Привет)
Хотелось бы обратиться с вопросом.
Не могу добиться стабильности работы ожидания. Использую C# и webdriver.
Нарушается последовательность кликов.

По теме получения коллекции элементов:
Для списочных однотипных элементов (например, содержимое каталога) использую получение списка (FindElements вернёт ReadOnlyCollection<IWebElement>), сортировку или фильтрацию элементов с помощью Linq (OrderBy, Where). Например, в результате запроса было возвращено 1000 ссылок. Все они есть на странице, но 50 из них отображены, а остальные скрыты (просто уже подгрузились ajax-ом). Таким образом нам нужно получить только те элементы из результата запроса, что видимы. И, допустим, нет доверия к порядку выдачи элементов на страницу, поэтому самостоятельно сортируем список элементов по значению атрибута id.
Псевдокод (в целом, псевдокод не совсем корректный, так как после FindElements и Where нужно проверять, что в коллекции есть хоть один элемент, иначе будет исключение (работа с пустым списком)):
var collectionLinks = Browser.FindElements(By.CssSelector(".list_item")).Where(webElement => (webElement.Displayed == true)).OrderBy(webElement => webElement.GetAttribute("id"));
foreach(var link in collectionLinks)
{
    link.Click();
    //...обработчик реакции на щелчок по ссылке
    btn1.Click();
    //...обработчик реакции на щелчок по кнопке
}

На псевдокоде всё красиво. В реальности элементы вытесняются из dom-модели (при щелчке по элементам (ссылке и кнопке), dom-модель перестраивается, и в результате ссылки на IWebElement, что хранятся в коллекции collectionLinks со временем становятся неактуальными - WebDriver скажет, что элемента нет в кеше).
Даже получение статуса видимости и получение атрибута id может создать ажиотаж работы с dom-моделью (если список большой, то обращений получится много), в результате ажиотажа с большим количеством элементов, другая часть элементов (в силу их относительной неиспользуемости) устареет. Это гипотеза, почему на самом деле так происходит не знаю (возможно, причина в самом тестируемом сайте: на сайте, что тестирую, огромное количество обработчиков на каждое событие - любое действие, любой клик, вызывают реакцию разнородного javascript-кода, который, работая асинхронно и запускаясь по таймеру, сам может в любое время создавать и менять элементы страницы, понижая удобство тестирования).
И к моменту завершения операции фильтрации и сортировки:
var collectionLinks = Browser.FindElements(By.CssSelector(".list_item")) //Получение коллекции
    .Where(webElement => (webElement.Displayed == true)) //Фильтрация
    .OrderBy(webElement => webElement.GetAttribute("id")); //Сортировка
коллекция уже может содержать устаревшие ссылки (если элементов было очень много).
И поэтому приходится отказываться от работы с большими коллекциями элементов, работая с одиночными элементами или малыми коллекциями.

По теме ожидания:
Базовый Explicit Wait и Implicit Wait у меня не работают. Поэтому использовал дополнительный поисковый механизм. На основу был взят способ из фреймворка TestStack.Seleno, где все операции по поиску элементов сосредоточены в объекте Finder, который возвращается по вызову метода Find() (объект и метод - часть TestStack.Seleno, их нет в Selenium.WebDriver).
На псевдокоде, например, поиск одиночного элемента выглядит так:
var stopWaitTime = DateTime.Now.AddSeconds(paramMaxWaitTime);
IWebElement result = null;
do
{
    result = ... тут поиск элемента по нужным критериям
}
wail((result == null) && (DateTime.Now <= stopWaitTime))
return result;
В TestStack.Seleno поиск выглядит так:
https://github.com/T...lementFinder.cs
а конкретно ожидание элемента использует базовый wait и сделано как метод расширения ElementWithWait (но у меня оно не работало):
https://github.com/T...erExtensions.cs

Такой функционал позволяет быть точно уверенным, что элемент будет искаться в течение указанного времени. А также позволяет писать подробные ошибки в лог, генерируя исключения с точным описанием, что поиск выполнялся в течение указанного времени, выполнялся по селектору ..., выполнялся относительно конкретного элемента ... или относительно страницы, и при этом, ещё сделать снимок экрана, сохранить в отладочный лог содержимое страницы, на которой нужный элемент так и не был найден. И всё это в одном месте - в дальнейшем не придётся дублировать код.
  • 0

#20 Selftest

Selftest

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

  • Members
  • Pip
  • 30 сообщений
  • Город:СПб

Отправлено 31 марта 2014 - 16:50

так ли необходим переход на webdriver или можно продолжать работать с RC?

 

например, записав тесты на IDE они все легко (в моем случае) трансформировались в RC

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


  • 0


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

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