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

Тесты периодически падают. Почему же?

java
selenium
webdriver
testng
Теги: #<Tag:0x00007f7b641f0900> #<Tag:0x00007f7b641f07c0> #<Tag:0x00007f7b641f05e0> #<Tag:0x00007f7b641f04a0>

(Denis Vovchenko) #1

В чем может быть проблема?Тесты за частую проходят корректно, а иногда сбоят с ошибками

org.openqa.selenium.StaleElementReferenceException: Element is no longer valid (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 104 milliseconds

либо

org.openqa.selenium.ElementNotVisibleException: Cannot click on element (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 94 milliseconds

либо

org.openqa.selenium.NoSuchElementException: Unable to find element with xpath = ....

То что WebDriver не может найти элемент с заданым xpath это понятно, но почему?Если он есть, и зачастую находит его.

Вот пример теста:

@Test
        public void test3ConnectorFilters()throws Exception {
    driver.findElement(By.xpath(".//div[2]/div/div[1]/div[1]/a")).isDisplayed();
    driver.findElement(By.xpath(".//div[2]/div/div[1]/div[1]/a")).click();
    driver.findElement(By.xpath(".//div[1]/div[2]/div/p/a")).isDisplayed();
    driver.findElement(By.xpath(".//div[1]/div[2]/div/p/a")).click();
    driver.findElement(By.xpath("//div[3]/div/div[2]/div/div/div/div/div/div/a")).click();
    String value1 = driver.findElement(By.xpath("//tr[3]/td/div")).getText();
    driver.findElement(By.xpath("//td[2]/input")).sendKeys(value1);
    String value2 = driver.findElement(By.xpath("//tr[4]/td/div")).getText();
    driver.findElement(By.xpath("//table[3]/tbody/tr/td[2]/input")).sendKeys(value2);
    driver.findElement(By.xpath("//select")).click();
    driver.findElement(By.xpath("//table[1]//td[1]/select/option[1]")).click();
    driver.findElement(By.xpath("//table[3]/tbody/tr/td/select")).click();
    driver.findElement(By.xpath("//table[3]/tbody/tr/td/select/option[1]")).click();
    driver.findElement(By.xpath("//td/div/div/a[2]")).click();
    driver.findElement(By.xpath("//div[2]/div/table/tbody/tr/td/a")).click();
    driver.findElement(By.xpath("//div[2]/table/tbody/tr[1]/td[1]/div")).getText().equals(value1);
    driver.findElement(By.xpath("//div[2]/table/tbody/tr[2]/td[1]/div")).getText().equals(value2);
    driver.findElement(By.xpath("//td[3]/a")).click();

Советы типа “сократи xPath, а то будут бить по рукам” и т.д. не актуальны, и прошу не писать. Поскольку ID элементов динамичны, а атрибуты одинаковы, и для поиска элемента, пока это единый путь. И прошу учесть, что тест линейный, просто пробегает по форме, поэтому элементы не выводятся в отдельные переменные.


(James May) #2

Добавьте таймаутов. Если совсем топорно, то Thread.sleep(5000) просто чтобы проверить. Обычно стэйтрефенс выпадает, когда элемент не успел подгрузиться и драйвер его не находит


(5am) #3

смысл этого ?


(Denis Gayevskiy) #4

По сути совета не дам, так как xPath использую крайне редко, в том числе из-за его нестабильности. Но хочу спросить, зачем в таком печальном случае делать UI автоматизацию? Она должна в первую очередь приносить пользу, а не быть вечной головной болью. Ваш набор эксепшенов как раз свидетельствует о том, что это будет долго и мучительно.

И еще:

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


(vmaximv) #5

А где вы в этом коде увидели проверки? :slight_smile:


(Denis Gayevskiy) #6

нет?


(vmaximv) #7

Угу. Один индус тоже написал

"some_text".equals(element.getText())

и искренне думал, что это ассерт.


(Denis Vovchenko) #8

Попробовал добавить Thread.sleep(5000) в этом тесте:

@Test(priority = 3)
public void checkProvidersTest() throws Exception {
    driver.findElement(By.xpath("//div[2]/div/div[1]/div[1]/a")).click();
    driver.findElement(By.xpath("//p[1]/a")).click();
    Assert.assertTrue(isElementPresent(By.xpath("//div[2]/div/div/table")));
    driver.findElement(By.xpath("//tr[2]/td[2]")).click();
    Thread.sleep(5000);
    Assert.assertTrue(isElementPresent(By.xpath("//div/div[3]/div[4]/div/div[3]/div/div[2]/div/div/table")));
}

Но все равно на втором Assert-е выдает эксепшин.


(Keiga) #9

А кусок кода страницы можно посмотреть? Очень любопытно посмотреть на все эти безликие div и tr


(vmaximv) #10

Там gwt - его “нахрапом” не возьмешь.


(Denis Vovchenko) #11

Как-то вот так:

<div style="position: absolute; left: 0px; width: 100%; top: 0px; min-width: 20px; min-height: 20px; overflow: hidden;">
<div style="position: absolute; left: 0px; width: 100%; bottom: 0px; min-width: 20px; min-height: 20px; overflow: hidden;">
<div style="position: absolute; left: 0px; width: 100%; overflow: hidden; top: 47px; height: 303px;">
<div class="GOSHEXWDON" style="position: relative; overflow: hidden; height: 100%;">
<div style="position: absolute; z-index: -32767; top: -20ex; width: 10em; height: 10ex; visibility: hidden;" aria-hidden="true"/>
<div style="position: absolute; overflow: hidden; left: 0px; top: 0px; right: -17px; bottom: -17px;">
<div style="position: absolute; overflow: scroll; left: 0px; top: 0px; right: 0px; bottom: 0px;">
<div class="GOSHEXWDJG" style="position: relative; min-width: 20px; min-height: 20px; display: block;">
<div style="visibility: hidden; position: absolute; height: 100%; width: 100%; overflow: scroll; z-index: -1;">
<div style="visibility: hidden; position: absolute; height: 100%; width: 100%; overflow: scroll; z-index: -1;">
<table class="table-condensed table-bordered table-striped" cellspacing="0" style="table-layout: fixed; width: 100%;">
<colgroup>
<tbody>
<tr class="GOSHEXWDLE" __gwt_subrow="0" __gwt_row="0">
<tr class="GOSHEXWDKF GOSHEXWDMF" __gwt_subrow="0" __gwt_row="1">
<tr class="GOSHEXWDLE GOSHEXWDCF" __gwt_subrow="0" __gwt_row="2">
<td class="GOSHEXWDKE GOSHEXWDME GOSHEXWDNE GOSHEXWDDF">
<td class="GOSHEXWDKE GOSHEXWDME GOSHEXWDDF">
<div __gwt_cell="cell-gwt-uid-421" style="outline-style:none;">EasyPay</div>
</td>
<td class="GOSHEXWDKE GOSHEXWDME GOSHEXWDDF">
<td class="GOSHEXWDKE GOSHEXWDME GOSHEXWDHF GOSHEXWDDF">
</tr>
<tr class="GOSHEXWDKF" __gwt_subrow="0" __gwt_row="3">
<tr class="GOSHEXWDLE" __gwt_subrow="0" __gwt_row="4">
<tr class="GOSHEXWDKF" __gwt_subrow="0" __gwt_row="5">
<tr class="GOSHEXWDLE" __gwt_subrow="0" __gwt_row="6">
<tr class="GOSHEXWDKF" __gwt_subrow="0" __gwt_row="7">
<tr class="GOSHEXWDLE" __gwt_subrow="0" __gwt_row="8">
<tr class="GOSHEXWDKF" __gwt_subrow="0" __gwt_row="9">
</tbody>
</table>
</div>
</div>
</div>
<div style="position: absolute; overflow: hidden; right: 0px; bottom: 0px; width: 0px; height: 0px;">
<div style="position: absolute; overflow: hidden; left: 0px; top: 0px; right: 0px; bottom: 0px; display: none;">
<div style="position: absolute; overflow: hidden; top: 0px; right: 0px; bottom: 0px; width: 17px; display: none;">

(Denis Vovchenko) #12

Что-то спасет?


(vmaximv) #13

Опыт в автоматизации.


(Denis Gayevskiy) #14

А что это за ресурс? Может все-таки стоит подумать над целесообразностью?


(Denis Vovchenko) #15

Это понятно. А в моем случае, вариантов больше нет. Может напишете, хоть в какую сторону смотреть?


(vmaximv) #16

Слишком много этих “сторон” на вашем текущем уровне.
“Нельзя так просто взять… и написать стабильные тесты для GWT+IE”
Но что бы не флеймить, покажу “тропинку” - www.google.ru/search?q=scLocator


(Denis Vovchenko) #17

Спасибо!


(Denis Vovchenko) #18

Еще такой вопрос:
если я проставлю статические id, и буду по ним искать.Столкнусь ли я с такими же проблемами?


(5am) #19

Уух! представляю, на сколько эти тесты офигенные в поддержке.
наверно при устройстве на новую работу, надо просить показывать часть кода автотестов работадателя :wink:


(vmaximv) #20

Где-то перестанет падать, где-то нет. Все “пофиксить” таким способом не получится.