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

Публикации leipreachan

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



#128351 Удержание фокуса на элементе

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

leipreachan, cпасибо за ответ.

Тесты у нас на 4х машинах, все под линуксом. Но, к сожалению, тестов намного больше.

Инетересует именно к/л возможность удерживать фокус при помощи кода. Или единственный способ прямо "жестким" способом залазить в DOM страницы? Или, на крайний случай, может быть есть какая-то логика в том когда фокус перескакивает с теста на тест (пока мне кажется, что это происходит случайным образом)? 

 

Используйте XVFB, если у вас всё под линуксом. Поднимите больше selenium-серверов и каждый с одним инстансом браузера

 

Логика переключения простая - каждое действие (кроме ожидания элемента) приводит к потере фокуса остальными окнами. С точки зрения OS невозможно держать два окна одновременно в фокусе =)




#128346 Удержание фокуса на элементе

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

Здравствуйте,

 

возникла следующая проблема. Имеется в наличии много тестов, разных веб-приложений, которые запускаются автоматически при изменениях в системе (для этих целей используем Jenkins). К сожалению случается, что запускаются 2 теста в одно и то же время на одной и той же машине. И эти тесты друг у друга то и дело крадут фокус. Все бы ничего, но в наличие есть тесты, где при потере фокуса происходит к/л событие (где-то javascript, где-то ajax), из-за которого тест не проходит.

Не сталкивался ли кто с такой проблемой? И как она решается? К сожалению, распределить тесты полностью так, чтобы они бежали в разное время или на разных машинах, нет возможности.

 

Запускайте на разных машинах =)

или на одной, но используйте xvfb, если под линуксом.

Второй вариант: "исправлять" JS, чтобы элементы не реагировали на смену фокуса.




#126618 Тесты падают изза реализации выхода из системы

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

 

опять StaleElement =)

обычно это значит, что у вас перерисовывается DOM-дерево и элементы "мигнули" на страницы (удалились, потом опять добавились)

 

из комментария не очень очевидно, на какой строке падает. На клике или wait?

попробуйте вот этот кусок:

<code>

WebElement element = wait.until(elementPresentWithAtribute("id", "tm-logoff"));
if (logoffLink.isDisplayed()) {
driver.findElement(By.id("tm-logoff")).click();


return pages.loginPage;
}

</code>

Вытащить в отдельный метод и обернуть в try{}catch{} по StaleElementReferenceException и выполнять его раза три-четыре.

Лично мне такой хак помогал.

Кроме того, возможно, вы обращаетесь, всё-таки, к неправильному элементу. В Firebug  есть возможность подсвечивать элементы, которые появляются на странице. Убедитесь, что нужный вам элемент не "перепоявялется"

 

Падает на 

new Actions(driver).moveToElement(userActionsGroup).perform();

ибо, как уже говорилось, даже меню не раскрывает

 

 

1) говорилось "почемуто отрабатывает через раз."

что конкретно - вы нигде не написали.

 

2) Попробуйте элемент не задавать через аннотацию, а искать непосредственно перед выполнением нужного вам кода. Как я уже говорил, возможно, происходит полное перестраивание DOM-дерева - никто не знает, что за JS-движок у вас на сайте. StaleElementException указывает в 90% случаев именно на это - DOM поменялся и элемента с таким же внутренним идентификатором (не css / xpath локатором, а именно внутренним идентификатором в движке браузера) уже нет.




#126586 Тесты падают изза реализации выхода из системы

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

опять StaleElement =)

обычно это значит, что у вас перерисовывается DOM-дерево и элементы "мигнули" на страницы (удалились, потом опять добавились)

 

из комментария не очень очевидно, на какой строке падает. На клике или wait?

попробуйте вот этот кусок:

<code>

WebElement element = wait.until(elementPresentWithAtribute("id", "tm-logoff"));
if (logoffLink.isDisplayed()) {
driver.findElement(By.id("tm-logoff")).click();


return pages.loginPage;
}

</code>

Вытащить в отдельный метод и обернуть в try{}catch{} по StaleElementReferenceException и выполнять его раза три-четыре.

Лично мне такой хак помогал.

Кроме того, возможно, вы обращаетесь, всё-таки, к неправильному элементу. В Firebug  есть возможность подсвечивать элементы, которые появляются на странице. Убедитесь, что нужный вам элемент не "перепоявялется"




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

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

 

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

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

 

 

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




#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');

?




#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% черезчур категоричным.




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

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

 

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

 

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

 

 

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

 

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

 

 

 

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

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

 

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

 

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




#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.

 

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

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




#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 секунд, просто в пять потоков. А я вам отвечу: а что если задача сложнее? если я не могу параллелить именно этот тест? Например, потому, что именно при переключении с одного периода подписки на другой уже неоднократно находили ошибку?

 

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

 

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




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

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

 

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

 

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

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

 

 

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

 

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




#128923 Связка WebDriver + TestNG + Bamboo

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

Тут требование клиента, так что...

соболезную =)




#128905 Связка WebDriver + TestNG + Bamboo

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

 

К чему теория, просто запустите Bamboo и вперёд!

Появятся проблемы -- приходите и задавайте вопросы :)

Появился вопрос - хочу запускать webdriver тесты на отдельной машине. Опыта с Bamboo нет. Девы на днях переведут проект на Bamboo, следующим шагом будет попробовать запускать unit тесты и ui тесты. UI тесты (Selenium Webdriver) пока запускаю у себя на машине с командной строки при помощи maven. В какую сторону копать? С чего вообще начать? Bamboo должен удалённо запускать тесты на отдельной машине и получать оттуда результаты. 

 

Bamboo, по моему личному мнению - крайне глючная вещь. Лучше Jenkins используйте.




#129044 Репортинг для WebDriver-тестов и не только

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

тысячи их, а конкретно - это CI-системы. TeamCity, Jenkins, Bamboo, Travis, Cruisecontrol, Hudson и т.п.

Если вам нужно специально под Selenium - тогда либо нужна доработка в вашем фреймворке, либо специальный плагин для CI-сервера.




#127302 Разрыв соединения с сервером

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

barancev

Не помогает. У меня предполагается 100000 запросов. Сначала сервер позволил сделать примерно 2000 запросов, затем 400, теперь каждые 200 запросов рвется соединение.

 

bash-скрипт + curl, вот ваше решение. Не нужен вам Селениум, скорее всего




#126705 Проблемы с кодировкой при сборке на TeamCity

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

Добавил в настройках build step шаг build, и кириллица перестала работать. Ранее я собирал локально через eclipse, а черех TC только прогонял тесты - поэтому было все хорошо.

 

Кто - нибудь знает как правильно задать кодировку шагу build ?

 

пишу на java, соответственно собираю при помощи ant

причём тут селениум?

 

где и как перестала работать кириллица?




#126990 Передача значения переменой a функцию

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

 

Нечего в sendKeys интеджер пхать :-)

:rofl:

А слона-то я и не приметил.

Вообще странно, IDE обычно пишет чёрным по-жёлтому:

140213_17645dda.png

Перевод: метод sendKeys(CharSequence...) у типа WebElement не поддерживает аргументы (int)

 

Я думал, там какой-то Exception вываливается.

 

Топик-стартеру:

Решение элементарно

void log_out2(int num) throws Exception
{
	//////////*************///////////////////////
	driver.findElement(By.id("username")).clear();
	driver.findElement(By.id("username")).sendKeys("" + num);
	//////////**************///////////////////
 
}

 

driver.findElement(By.id("username")).sendKeys("" + num);

так нельзя делать, ай-ай-ай!!!

if (num!=null) {

 driver.findElement(By.id("username")).sendKeys(num.toString());

}




#127093 Передача значения переменой a функцию

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

 

driver.findElement(By.id("username")).sendKeys("" + num);

так нельзя делать, ай-ай-ай!!!

if (num!=null) {

 driver.findElement(By.id("username")).sendKeys(num.toString());

}

 

num не может быть равен null, потому что num объявлен как int - это не объект, а примитивный тип.

Если бы num был объявлен как объект Integer, тогда проверка на null нужна обязательно.

 

А вот Ваш код должен выдать ошибку IDE:

140213_17cd0479.png

 

 

 

вы правы насчёт ошибки IDE (пару лет уже на java не писал), общий смысл был в использовании toString() =)

 

Использовать конструкцию ""+int  не принято, т.к. такой код "плохо пахнет" =)




#128308 Ожидание появления элемента

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

На сайте имеется кнопка, при нажатии на которую появляется pop-up с выпадающим списком, на который необходимо нажать.

Тем не менее, иногда браузер не успевает отобразить выпадающий список и генерируется ошибка. WaitElement() и Thread.sleep() по какой-то причине иногда не помогают.

Подскажите, пожалуйста, как решить проблему?

Забегая вперед, как вариант - перед нажатием проверять, что элемент имеет размеры более определенных значений, но не знаю как это реализовать.

 

popup с выпадающим списком? это отдельное окно в IE или это какой-то элемент сайта, который маскируется под обычный попап?




#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.

 

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




#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 я не знаю.




#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?

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




#124894 Обновил selenium-standalone, перестали регистрироваться ноды

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



Всем привет!

Буквально еще вчера использовал selenium-server-standalone-2.31.0, сегодня решил обновиться до последней версии 2.37.0. Хаб запустился, а вот ноды никак не могу зарегистрироваться на хабе, причем в логе хаба пишет, что они зарегены. Попробовал запустить 31-ю версию, все подключилось мгновенно. Что изменилось в 37-й версии?

в 34й изменился механизм выдачи id сессии.
Ноды и грид одной версии?

Да, конечно. Хаб и ноды всё 37-ой версии. И как теперь быть?



если ещё актуально: какая OS? возможно, проблема в брандмауэре?