Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Jenkins и Selenium тесты


(tshcherbyna) #1

Всем доброго времени суток!
В автоматизированном тестировании я новичок, поэтому прошу помощи в решении следующей проблемы:
Есть тест сьют с большим количеством тестов(связка jUnit - Selenuim) При запуске их через браузер все отлично, все проходят, но когда собираем их на Jenkins большинство падает и выдает ошибки типа Unable to locate element.
Подскажите, в чем может быть проблема?
Спасибо!


(streLer) #2

побольше информации об окружении напишите.


(Александр Таранков) #3

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

Попробуйте для одного теста, который стабильно падает в рабочем окружении, в качестве эксперимента сделать дополнительные wait-ы для элементов перед обращением к ним.


(tshcherbyna) #4

@streLer Изначально, тесты запускались через браузер IE, при сборкеJenkins использовала RemoteWebDriver,в качестве BrowserName использовалась Mozilla версии 24.0, Platform - Linux.

@joemast Wait-ы перед элементами делала не помогает.Интересно, что каждый раз падают определенные тесты.


(Александр Таранков) #5

Допилите тесты под FF. Если вы разрабатывали их под IE, они под FF не гарантированно заработают.


(tshcherbyna) #6

@joemast Я не совсем понимаю что значит допилите под FF и зачем?
Тесты запускались и под мозилой, просто я использовала браузер IE по принципу,если там заработает, то на остальных тоже!


(streLer) #7

Если я вас правильно понял, вы используете Grid, машина на которой стоит IE , какая версия браузера? необходимо подобрать нормально работающий IEdriver. Самый нормальный IEDriverServer 2.32.3.0


(tshcherbyna) #8

Я использую Grid, но не IE, а Mozilla версии 24.0, и использую RemoteWebDriver.
Просто про IE я использовала при тестировании через браузер и таким образом имела ввиду, что тесты работают…но при сборке на jenkins некоторые валятся.


(streLer) #9

Тогда напишите пример хотя бы одно локатора, который он не находит, вы по xpath ищите? попробуйте через css . и приведите пример кода , где инициализируется FF драйвер, профиль используете?


(Александр Таранков) #10

в том-то и дело, что это не так. Верстка тестируемого приложения может различаться под разными браузерами. WebDriver под разные браузеры использует разный XPath-движок (что критично, если вы xpath-локаторы используете)

И ещё, под линухом рекомендуют FF версии 20 использовать на данный момент. Дело в том, что FirefoxWebDriver не успевает за последними версиями мозиллы, поэтому в самых последних что-то может работать не так как ожидается. Лучше использовать версию чуть постарше


(tshcherbyna) #11

@streLer не видит элементы, например: id = “search”, а так же xpath: .//*[@class=‘search-button hidden’], вот как я все это делаю с удаленным драйвером:
DesiredCapabilities capabilities = DesiredCapabilities.firefox();
capabilities.setBrowserName(“firefox”);
capabilities.setPlatform(Platform.LINUX);
capabilities.setVersion(“20.0”);
driver = new RemoteWebDriver(new URL(""), capabilities);


(tshcherbyna) #12

@joemast спасибо за совет по поводу версии, поменяла, но,к сожалению, результата нет.
С мозилой пробовала, все проходит. Проблема, как мне кажется именно в удаленном драйвере, который не видит элементов.Но как ее решить, пока не придумала


(tshcherbyna) #13

нашла источник проблемы: действительно мозиловский драйвер прогоняет тесты намного быстрее, и он просто не успевает увидеть элементы.Но теперь не знаю, как это исправить, так как просто wait-ы не помогают!


(streLer) #14

Точка перед // не нужна. и попробуйте сделать ожидание перед нажатием , например так :
WebDriverWait waitTool= new WebDriverWait(driver, 10);
waitTool.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id=seatch’]")));

p.s. и почему вы обращаетесь к скрытому классу? //*[@class=‘search-button hidden’]


(tshcherbyna) #15

@streLer у меня есть кнопка search, я должна ее найти, кликнуть по ней, после этого появляется строка, в которую я вписываю название того, что я ищу.(скрытый класс - это и есть эта кнопка, просто так называется), вообще xpath такой: .//[@id=‘header’]/div/a[2], но к xml: , поэтому что бы он не был трехэтажным я заменила на //[@class=‘search-button hidden’]

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


(Александр Таранков) #16

попробуйте всё-таки другие xpath-выражения. Возможно, что проблема и не в wait-ах. Например, для кнопки может подойти что-то типа //button[@id=‘search-button’], или @name, если id не задан, либо ещё как-то. Искать xpath по свойству @class не очень хорошая идея изначально, а уж по такому выражению как у вас и вовсе найдется скрытая кнопка, в которую WebDriver не сможет кликнуть.

Напишите сюда html вокруг вашей кнопки, вам подскажут как её найти.

А ещё интересно с каким Exception падают тесты - это тоже может подсказать путь к решению. Посмотрите все ли они одинаковые, возможно проблема не одна, а несколько. Решайте их по-очереди


(tshcherbyna) #18

а так же выводит StaleElementReferenceException: Element not found in the cache - perhaps the page has changed since it was looked up


(Александр Таранков) #19

ElementNotVisibleException возникает, когда вы пытаетесь взаимодействовать с существующим в DOM, но невидимым пользователю элементом. Это как раз та кнопка класса hidden. Поменяйте xpath и у вас заработает.

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


(tshcherbyna) #20

@joemast

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

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

 NewPartnership newPartnership = partnershipsPage1.clickAddPartnership();
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        assertTrue(newPartnership.ifDisplayed(By.xpath("//*[@id='navigation']/div/div[2]/a[1]/i")));
        driver.findElement(By.xpath(".//*[@id='navigation']/div/div[2]/a[1]/i"));
        PartnershipsPage partnershipsPage = newPartnership.clickSave();

перешли по ссылке, зашли на страницу, нажали Save


(Александр Таранков) #21

Не видя полностью кода, сложно ответить на ваш вопрос. Посмотрите внимательно exception stacktrace, найдите в какой строке в вашем коде он происходит. От неё и раскручивайте