В чем может быть проблема?Тесты за частую проходят корректно, а иногда сбоят с ошибками
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 элементов динамичны, а атрибуты одинаковы, и для поиска элемента, пока это единый путь. И прошу учесть, что тест линейный, просто пробегает по форме, поэтому элементы не выводятся в отдельные переменные.
Добавьте таймаутов. Если совсем топорно, то Thread.sleep(5000) просто чтобы проверить. Обычно стэйтрефенс выпадает, когда элемент не успел подгрузиться и драйвер его не находит
По сути совета не дам, так как xPath использую крайне редко, в том числе из-за его нестабильности. Но хочу спросить, зачем в таком печальном случае делать UI автоматизацию? Она должна в первую очередь приносить пользу, а не быть вечной головной болью. Ваш набор эксепшенов как раз свидетельствует о том, что это будет долго и мучительно.
И еще:
Зачем здесь дублировать проверки? Ведь если элемент не видим, то селениум вывалит эксепшен при попытке клика.
vmaximv
(vmaximv)
April 14, 2015, 7:38am
#5
А где вы в этом коде увидели проверки?
vmaximv
(vmaximv)
April 14, 2015, 7:41am
#7
Угу. Один индус тоже написал
"some_text".equals(element.getText())
и искренне думал, что это ассерт.
3 Likes
Попробовал добавить 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
(Keiga)
April 14, 2015, 7:53am
#9
Denis_Vovchenko:
Советы типа “сократи xPath, а то будут бить по рукам” и т.д. не актуальны, и прошу не писать. Поскольку ID элементов динамичны, а атрибуты одинаковы, и для поиска элемента, пока это единый путь.
А кусок кода страницы можно посмотреть? Очень любопытно посмотреть на все эти безликие div
и tr
vmaximv
(vmaximv)
April 14, 2015, 7:57am
#10
Там gwt - его “нахрапом” не возьмешь.
Я б с удовольствием, но с таким DOM-ом это не просто:
<div class="GIAU1ENBMO GIAU1ENBNO" style="position: absolute; left: 0px; top: 0px; right: 0px; bottom: 0px;">
<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: 0px; bottom: 0px;"><div id="gwt-uid-30" class="accordion" style="position: absolute; left: 0px; top: 0px; right: 0px; bottom: 0px;"><div class="accordion-group" style="">
<div class="accordion-heading selected-menu-item">
<a id="gwt-uid-32" class="accordion-toggle collapsed" href="#gwt-uid-31" data-toggle="collapse"…
Как-то вот так:
<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;">
А что это за ресурс? Может все-таки стоит подумать над целесообразностью?
Это понятно. А в моем случае, вариантов больше нет. Может напишете, хоть в какую сторону смотреть?
vmaximv
(vmaximv)
April 14, 2015, 8:41am
#16
Слишком много этих “сторон” на вашем текущем уровне.
“Нельзя так просто взять… и написать стабильные тесты для GWT+IE”
Но что бы не флеймить, покажу “тропинку” - scLocator - Google Search
Еще такой вопрос:
если я проставлю статические id, и буду по ним искать.Столкнусь ли я с такими же проблемами?
5am
(5am)
April 14, 2015, 10:00am
#19
Уух! представляю, на сколько эти тесты офигенные в поддержке.
наверно при устройстве на новую работу, надо просить показывать часть кода автотестов работадателя
vmaximv
(vmaximv)
April 14, 2015, 10:23am
#20
Где-то перестанет падать, где-то нет. Все “пофиксить” таким способом не получится.