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

Публикации leipreachan

94 публикаций создано leipreachan (учитываются публикации только с 29 апреля 2023)



#127125 Обход StaleElementReferenceError: el is not attached в js

Отправлено автор: leipreachan 17 февраля 2014 - 07:53 в Selenium - Functional Testing

 

В порядке эксперимента разделите получение элемента (где и вылетает это исключение) от клика по нему. Оберните в try{} catch {} именно findElement.

 

кстати, элемент у вас, случайно, не двигается во время клика?

 

 

Вылетало именно при попытке .click(), елемент передобавлялся в DOM из за чего и вылетала ошибка.

try...catch не подходит для ассинхронного кода. Ошибка приходит именно в этот error callback , function(err) где мы и обрабатываем полученную ошибку.

 

Сейчас в этом коде при любой ошибке просто возвращаеться false в wait и wait пытается еще раз попробовать найти елемент и сделать клик.

 

 

Можно написать как то так, что бы перехватывать именно нужную ошибку.

    driver.wait(function() {
        return driver.findElement(target).click().then(
            function(click) { return true },
            function(err) { 
                if (err = StaleElementReferenceError) {
                    return false;
                } else {
                    throw err;
                }
            }
        );
    }, 10000);

 

 

ээ

для асинхронного - не подходит, но ведь findElement и click должны выполняться последовательно.   а, понял о чём вы. wait асинхронный.

 

Вы написали именно то, что я и имел в виду. Более удобного способа обходить StaleElementException я не знаю.




#126955 Обход StaleElementReferenceError: el is not attached в js

Отправлено автор: leipreachan 13 февраля 2014 - 08:07 в Selenium - Functional Testing

 

Если "исключение не перехватывается" это либо ошибка в Java (что маловероятно :)), либо ошибка в Вашем коде -- скорее всего исключение возникает не там, где Вы его пытаетесь перехватывать. Покажите полный stacktrace, может быть это добавит ясности, где оно возникает.

Потерзал наших java скриптеров и они ответили то же что и вы :) ('скорее всего исключение возникает не там, где Вы его пытаетесь перехватывать').

error нужно перехватывать в error callback -e:

driver.wait(function() {
        return driver.findElement(target).click().then(
            function(click) { return true },
            function(err)   { return false }
        );
}, 10000);

В порядке эксперимента разделите получение элемента (где и вылетает это исключение) от клика по нему. Оберните в try{} catch {} именно findElement.

 

кстати, элемент у вас, случайно, не двигается во время клика?




#128908 Выбор из выпадающего списка

Отправлено автор: leipreachan 01 апреля 2014 - 15:02 в Selenium - Functional Testing

Абсолютно не очевидно - как и ваш ответ с соседней теме.
Покажите разницу между (//select[@id='country']/option)[1] и //select[@id='country']/option[1].
Могу подсказать что эти варианты отличаются как минимум производительностью, а первый вариант имеет достаточно "подводных камней".

 

оператор [] в xpath имеет больший приоритет, чем //

ваше выражение возвращает массив из N элементов и выбирает все опции, которые являются первым потомком select. Т.е., опять же все :)

 

Пояснение есть, например, тут: http://stackoverflow...text-with-xpath

 

Ну, и в конце концов, проверьте.

Далеко ходить не надо - проверьте, какой элемент на этом топике //h3[2], а какой (//h3)[2]

Выражение Виталия выбирает все опции в массив, а из них уже получает первое




#128931 Выбор из выпадающего списка

Отправлено автор: leipreachan 02 апреля 2014 - 08:54 в Selenium - Functional Testing

Парни, я прекрасно знаю что такое предикаты, node-sets, context и т.д. И вполне себе понимаю разницу между (//h3)[2] и //h3[2].

По производительности: давайте я "откомпилирую" эти выражения
1. //select[@id='country']/option[1] - браузер серчит DOM с начала, находит <select id='country'>, берет первый чайлд <option>, применяет к нему предикат [position()=1], получает тру => искомый элемент найдет => коней
2. (//select[@id='country']/option)[1] - браузер серчит DOM с начала, находит <select id='country'>, собирает *всех* чайлдов <option> (которые нам абсолютно не нужны), и идет гулять дальше по DOM выискивая новых кандидатов.
Какой вариант будет быстрее? Подсказка - select с 100К опциями во втором варианте отправил Opera'у в нокаут минут на 20.

По "счастливому стечению обстоятельств" и стабильности:
//select[@id='country']/option[1] - я точно знаю, что ищу: опцию в селекте, которая является первым чайлдом.
1. Если у селекта первый чайлд не option (optgroup во внимание не берем) - это баг => тест должен упасть.
2. Если имеет место быть



<select id='county'>
  <option>1</option>
</select>
<select id='county'>
  <option>3</option>
</select>
То //select/option[2] приведет к вполне ожидаемому фейлу, при(//select[@id='county')[2] выберет первое значение второго селекта, что не совсем ответствует ожиданиям.

 

 

у вас html с проблемкой: два элемента с одинаковым id. Вас это не смущает?




#128938 Выбор из выпадающего списка

Отправлено автор: leipreachan 02 апреля 2014 - 11:16 в Selenium - Functional Testing

Нет. Мопед не мой - это дэвы. Если вас это смущает - замените id на name например - это сути не меняет.

я бы багу влепил за такой HTML. Так делать нельзя (раз)

 

Расширим пример до:

<select id='county'>
  <option>1</option>
  <option>2</option>
</select>
<select id='county'>
  <option>3</option>
  <option>4</option>
</select>

вы ведь в курсе, что //select/option[2] выберет два элемента?

Полагаю, топикстартеру важнее выбрать, всё-таки, ОДИН элемент




#128944 Выбор из выпадающего списка

Отправлено автор: leipreachan 02 апреля 2014 - 13:46 в Selenium - Functional Testing

 

Протестировал оба варианта на FF 28.0, среднее время поиска локатора составило 25 мс в обоих случаях (30 опытов на 100000 option'ах).

Вы правы - мой фейл. Время во всех браузерах примерно одинаковое. Только одна опера (12.16) честно пытается создать сет нодов и падает по таймауту через WD+OperaDriver, либо виснет очень надолго, если ручками через dragonfly.

В общем так я от вас и не услышал, почему имея такой сорс





<body>
  <select>
    <option>a</option>
    <option>b</option>
  </select>
</body>

правильнее писать (//select/option)[1], а не //select/option[1]? При том, что наличие у select других чайлдов, отличных от option - это хак,баг и провокация. А при использовании сета есть вероятность "влететь" в совершенно другой селект.

 

в случае вашего примера - всё одинаково

 

По поводу хаков-багов-провокаций: в select можно запихнуть, например, <input type=hidden/>. Это вообще никак не скажется на вёрстке. А вот на отправке формы - может сказаться.




#128181 Selenium Grid (parallel testing)

Отправлено автор: leipreachan 13 марта 2014 - 07:23 в Selenium - Functional Testing

Проблема не в selenium grid, а в phpunit.

Чтобы добиться паралельного выполнения, каждый тест должен запускаться в отдельном потоке. Это очень красиво реализовано в testNG. В phpunit же есть аннотация @runTestsInSeparateProcesses или ключ --process-isolation . Но они не работаю. Себастьян Бергман(разработчик phpunit) обещает исправить этот баг в версии 4.x

Будем ждать, а пока ребята из saurcelabs нашли вот такой workaround.

Так же можно попробовать реализовать свое распределение тестов с помощью maven и/или других build тулов.

параллельте своими средствами. например, через ant

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




#129440 Запуск удаленного selenium-сервера

Отправлено автор: leipreachan 11 апреля 2014 - 11:15 в Selenium - Functional Testing

То есть selenium-server необходимо поставить и на виртуалке и на своей машине?

нет, только на виртуалке. подключаться к нему по адресу, который получает виртуалка (ip addr в консоли) + порт.




#124893 Selenium не находит локаторы

Отправлено автор: leipreachan 09 декабря 2013 - 15:09 в Selenium - Functional Testing

Спасибо друзья за помощь.Заработало... :clapping:/>
Версию фаерфокса оставил последнию (25.0.1), а вот версию WebDrivera пришлось понизить до 2.31.
Использовал FirefoxDriver , так как HtmlUnitDriver не заработал...Следовательно вопрос - для чего он нужен?

для страниц без множества ajax. Статику с его помощью легко и быстро можно проверять



#128273 Тестовое задание на собеседование ufs-online.ru

Отправлено автор: leipreachan 14 марта 2014 - 11:54 в Selenium - Functional Testing

Вопрос был про Java - в ней нет оператора безусловного перехода
 

 

упустил, что вы говорили только о Java.

 

 

Я не совсем понимаю, что вы имеете ввиду под словом "логика". Всяческие сложные конструкции имеют место быть в ядре фреймворка, но это не относится ни к AUT ни к тестам. Если под "логикой" вы имеете ввиду моделирование поведения AUT - то это должны делать непосредственно сами тесты.

 

 

под логикой я понимаю бизнес-логику.

тогда я не понимаю, что вы имеете в виду под "ядром фреймворка"?!

Selenium?

что такое тест? метод?




#128277 Тестовое задание на собеседование ufs-online.ru

Отправлено автор: leipreachan 14 марта 2014 - 12:44 в Selenium - Functional Testing

"Ядро фреймворка" - это собственный четырех-колёсный "велосипед", который есть практически у каждого :)

Тест - это код, который представляет из себя последовательность шагов и проверок, и не важно насколько эта последовательность децентрализована.

я, почему-то, и так был уверен, что вы говорите именно о testcase.

 

лично моя точка зрения, что "везде можно обойтись без условий и циклов" - вот это утверждние категоричнее некуда. и с ним я не согласен.

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




#128270 Тестовое задание на собеседование ufs-online.ru

Отправлено автор: leipreachan 14 марта 2014 - 11:11 в Selenium - Functional Testing

 

Вы путаете понятия условный переход и ветвление. В цикле ветвления нет - есть условный переход.
Если вы покажите как организовать цикл в Java используя только последовательное выполнение команд и ветвление - я буду аплодировать сам стоя.

 

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

 

 

Ну как бы есть goto, который, хоть и считается плохим тоном, но всё равно существует почти во всех языках.

 

Или я вас совсем перестал понимать

 

 

 

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

А как можно использовать повторно атомарное действие специфичное только для данного теста?

 

всё зависит от тестового плана. возможно, это не специфичное действие.

 

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




#128129 Тестовое задание на собеседование ufs-online.ru

Отправлено автор: leipreachan 12 марта 2014 - 11:14 в Selenium - Functional Testing

 

А почему, собственно, нельзя?
"Ввести любое значение из такого-то класса эквивалентности" -- уж так-то точно можно делать.

В теории и в примитивных случаях, либо в случаях когда нужна рандомизация - можно ("Введите имя пользователя из 8 букв").В остальных случаях вся эта не детерминированность кроме проблем "У меня все работает!" и т.д. никакой пользы не несет => вредна.

 

 

Раз вы настолько критичны, я вам предложу почитать про fuzzy testing. Автоматизация в этой методологии очень помогает.




#128128 Тестовое задание на собеседование ufs-online.ru

Отправлено автор: leipreachan 12 марта 2014 - 11:13 в Selenium - Functional Testing

 

>> 2. Нет. Но есть xpath/css. Перебирать элементы в цикле, что бы вытащить какой либо аттрибут или текст, или их комбинацию - это ересь.

 

не стоит так однозначно судить. Быввают случаи...

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

 

 

Я могу привести пример. A/B тестирование, например.

 

Если вы не можете повлиять на то, в какую фокус-группу попадает ваш тестовый пользователь, то вам нужно добавлять ветвление в тест (тесткейс / зависимый тест / или как вы их там группируете).




#128149 Тестовое задание на собеседование ufs-online.ru

Отправлено автор: leipreachan 12 марта 2014 - 14:44 в Selenium - Functional Testing

 

В топике речь о функциональном UI тестировании, поэтому fuzzy "за бортом".

 

 

 

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

 

Я могу привести пример. A/B тестирование, например.

 

Если вы не можете повлиять на то, в какую фокус-группу попадает ваш тестовый пользователь, то вам нужно добавлять ветвление в тест (тесткейс / зависимый тест / или как вы их там группируете).

 

Вы наверное не то сообщение процитировали, так как вопрос про итерации, а ответ про ветвление. 

 

В случае А/В безусловно будут иметь место всяческие ухищрения (альтернативные локаторы/сценарии) - много чего можно наворотить, но не в виде


public void test(){
  if (element1.exist()){
   button1.click();
}else{
   button2.click()
}
}

 

вроде бы, то процитировал, что хотел.

 

1) Простите, но итерации без условия - вечный цикл.

2) Про циклы. Например, представим себе задание на тест, чтобы тест в рамках одной сессии прокликивал все варианты цен где-нибудь. Например, цены подписки на месяц, полгода, года, десять лет на какой-нибудь журнал и проверял, что цена подписки вычисляется правильно и т.п.

Вы можете сказать: "хха, тут нужно использовать датапровайдеры!", на что я вам отвечу: "хха, датапровайдеры не всегда можно использовать, если добрать до какого-нибудь раздела занимает, например, 40 секунд (тестом), а прокликать все варианты цен - десять.

Вы (я предполагаю, что вы так предложите), заявите: ну и что. Я их распараллелю и все тесты будут проходить в 45 секунд, просто в пять потоков. А я вам отвечу: а что если задача сложнее? если я не могу параллелить именно этот тест? Например, потому, что именно при переключении с одного периода подписки на другой уже неоднократно находили ошибку?

 

Мне кажется, вы слишком категорично говорите о том, что "нельзя использовать циклы и условия!!"

 

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




#128187 Тестовое задание на собеседование ufs-online.ru

Отправлено автор: leipreachan 13 марта 2014 - 07:58 в Selenium - Functional Testing

 

1) Простите, но итерации без условия - вечный цикл.

Давайте говорить в рамках терминологии http://ru.wikipedia....рограммирование

 

Давайте. Вы сказали об "итерации". Приведите тогда определение итерации, в вики есть "цикл".

 

Мы точно об одном и том же говорим? Цикл почти везде можно реализовать через for(), while() и do{}while(). Каждый из этих циклов суть есть действия, которые повторяются до достижения какого-то условия. Не прямое IF, но, тем не менее, условие.

 

 


2) Про циклы. Например, представим себе задание на тест, чтобы тест в рамках одной сессии прокликивал все варианты цен где-нибудь. Например, цены подписки на месяц, полгода, года, десять лет на какой-нибудь журнал и проверял, что цена подписки вычисляется правильно и т.п.

Опять не удачный пример - вполне себе нормальный тест:
1. Выберете журнал ХХХ
2. Проверьте что у данного журнала существуют подписки на месяц, полгода, года, десять лет
3. Нажмите на подписку на месяц
4. Проверьте что цена посчиталась правильно
5. Нажмите на подписку на полгода
6. Проверьте что цена посчиталась правильно
7. Нажмите на подписку на год
8. Проверьте что цена посчиталась правильно
9. Нажмите на подписку на десять лет
10. Проверьте что цена посчиталась правильно

Вполне себе ТК на 5 степов (остальные это верифаи). Городить тут циклы/хешмэпы/массивы/дата_провайдеры просто не к чему. Вы скажите, а если бы вариантов подписки было over 9000+? Тут классы эквивалентности в помощь, т.к. у этих over 9000+ верифаев КПД будет околонулевой.

 

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

Вообще, это уже становится похоже на спор "функциональное программирование vs ООП".

 

Если вы и правда сильно разделяете требования к коду тестов и page objects.. ну ок, что.

Для справки: в моих 300+ тестах на биллинг (т.е. интеграции с paypal, adyen, globalcollect, googlewallet и т.п.) 0 "for", 25 "if", 0 "findElements", но я, тем не менее, считаю, что ваше утверждение про 90% черезчур категоричным.




#128183 Тестовое задание на собеседование ufs-online.ru

Отправлено автор: leipreachan 13 марта 2014 - 07:38 в Selenium - Functional Testing

 

 

 

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

 

Довольно категоричное утверждение, везде можно обойтись без условий и циклов, вопрос в простоте того или иного подхода я думаю.

 

 

Очень рад, что ваш стиль программирования не допускает наличия цикла или условия.

 

Кажется, вы мне пытаетесь доказать, что тесткейс не должен содержать ветвления, а что уж у него в API творится (в page objects или что вы там используете) - это к тесту не имеет отношения?

 

Право, мне интересно, если вы описываете интерфейс страницы, в которой есть обязательные элементы, то, например, метод validateMandatoryElements() у вас будет просто перечислением десяти элементов? Прямо вот в так вот:

selenium.isElementPresent('someElement1');
selenium.isElementPresent('someElement2');
selenium.isElementPresent('someElement3');
selenium.isElementPresent('someElement4');

?




#128803 Headless запуск Selenium WebDriver

Отправлено автор: leipreachan 31 марта 2014 - 08:56 в Selenium - Functional Testing

Вопрос наивный, но всё же:

 

C:/phantomjs-1.9.7-windows/phantomjs.exe

 

по этому пути у вас драйвер запускается?




#128725 Headless запуск Selenium WebDriver

Отправлено автор: leipreachan 27 марта 2014 - 07:45 в Selenium - Functional Testing

у вас всё выпытывать?=)

 

как запускаете? ошибку?




#128708 Headless запуск Selenium WebDriver

Отправлено автор: leipreachan 26 марта 2014 - 15:16 в Selenium - Functional Testing

Провозился сегодня полдня с фантомJS. В итоге ошибку(org.openqa.selenium.remote.unreachablebrowserexception) обойти не удалось. 
Может кто-нибудь более популярно объяснить как его прикрутить к селениуму?
Нашел такую статейку (http://www.appneta.c...d-testing-java/). Вроде бы все популярно расписано, но делаю все так же, а ошибки сыпятся и сыпятся(

 

у вас именно запуск не работает или на этапе теста падает?




#128599 Headless запуск Selenium WebDriver

Отправлено автор: leipreachan 25 марта 2014 - 08:02 в Selenium - Functional Testing

Фантом штука интересная, но если сложный ajax на странице и вёрстка не очень простая, то там оооочень много возни может быть.

Например, в хроме и firefox (и в IE) все тесты работают, а в фантоме какой-нибудь клик ничего не делает.

И сиди там, дебажь.. =(




#128687 Headless запуск Selenium WebDriver

Отправлено автор: leipreachan 26 марта 2014 - 09:01 в Selenium - Functional Testing

Т.е. на самом деле встречали такую ситуацию когда WebKit'овый браузер (та же версия движка) отрабатывает без проблем, а PhantomJS не фурычит?

 

Смотря что считать "другим webkit-овым" браузером. Хром? Да, он спокойно отрабатывает. Сафари пробовали (но не на регулярной основе) - тоже работает




#126689 Загрузка страницы в phantomjs

Отправлено автор: leipreachan 07 февраля 2014 - 07:32 в Selenium - Functional Testing

В Selenium 2 при использовании браузера Phantomjs, .get(url) не дожидается полной загрузки страницы и переходит к следующей строке кода. Сейчас проверяю видимость необходимых мне элементов перед тем как выполнить следующее действие. 

Можно ли проверить из теста, загрузилась страница или нет? На странице куча ajax.

 

UPD: также требуется после клика по элементу узнать подгрузился ли ajax - это возможно?

1) "Можно ли проверить из теста, загрузилась страница или нет? На странице куча ajax."

а что вы понимаете под "загрузилась"? все картинки и скрипты подгрузились? если они прописаны в исходниках страницы - селениум ждёт. А если есть какие-то события, отличные от onload, сгенерённые какой-то JS-магией, то их невозможно "просто так" получить.

 

2) Какой у вас js-фреймворк?

 

3) "также требуется после клика по элементу узнать подгрузился ли ajax - это возможно?" Решения для общего случая нет. Только для частных: искать переменную, которая меняется в JS после окончания загрузки, смотреть её состояние, искать элемент и т.п.




#127276 Обновление DOM

Отправлено автор: leipreachan 20 февраля 2014 - 09:27 в Selenium - Functional Testing

Вопрос решен.

Всплывающее окно оказалось просто новым элемент в HTML-тэге исходной страницы.

Для обращения к элементу появившегося окна необходимо выполнить (XPath изменен на корректный):

time.sleep(10)
driver.find_element_by_xpath("//div[@class='nameId']/div[@sbisname='Ok']/div").click();

За решение спасибо Petrov.Sergey

 

тогда я искренне вам рекомендую подучить терминологию.

Всплывающее окно - это новое окно браузера. Вы говорили о каком-то popup, реализованном через вёрстку :)




#127246 Обновление DOM

Отправлено автор: leipreachan 19 февраля 2014 - 11:41 в Selenium - Functional Testing

Подскажите, пожалуйста, как обновить DOM, без перезагрузки страницы, при помощи Selenium?

начнём с начала - а вам для чего?