![Фотография](https://secure.gravatar.com/avatar/99eeab1fdbc15eebb38ec0bd76c68e37?s=100&d=https%3A%2F%2Fsoftware-testing.ru%2Fforum%2Fpublic%2Fstyle_images%2Fmaster%2Fprofile%2Fdefault_large.png)
Небольшая часть тестов валятся в ИЕ
#1
Отправлено 28 октября 2011 - 09:10
org.openqa.selenium.StaleElementReferenceException: Element is no longer valid (WARNING: The server did not provide any stacktrace information); duration or timeout: 18 milliseconds
Build info: version: '2.9.0', revision: '14289', time: '2011-10-20 21:54:54'
System info: os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.6.0_26'
Driver info: driver.version: RemoteWebDriver
Тесты пишу таким вот макаром, раньше какая то часть тестов тоже валилась во всех браузхерах, но потом по совету Demetri стал использовать имплицитные ожидания и во всех браузерах кроме ИЕ тесты стали стабильно ходить не один не валиться тьфу тьфу
@Test
public void LoginPageTestNg_test9() throws Exception {
wd.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
wd.get("http://www.mamba.ru/");
WebElement myDynamicElement = wd.findElement(By.cssSelector("li.BarMenu a"));
myDynamicElement.click();
wd.findElement(By.cssSelector("div"));
}
@Test
public void LoginPageTestNg_test10() throws Exception {
wd.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
wd.get("http://www.mamba.ru/");
WebElement myDynamicElement = wd.findElement(By.cssSelector("li.WapMenu a"));
myDynamicElement.click();
wd.findElement(By.cssSelector("div"));
}
@Test
public void LoginPageTestNg_test11() throws Exception {
wd.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
wd.get("http://www.mamba.ru/");
WebElement myDynamicElement = wd.findElement(By.cssSelector("div#FindTravelers h2 a"));
myDynamicElement.click();
wd.findElement(By.cssSelector("div"));
}
Может попоробовать через эксплицитное ожидание?
WebDriver driver = new FirefoxDriver();
driver.get("http://somedomain/ur...delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver d) {
return d.findElement(By.id("myDynamicElement"));
}});
#2
Отправлено 30 октября 2011 - 19:47
#4
Отправлено 31 октября 2011 - 10:45
хм, у меня почти также, толоько тесты иногда падают на хроме, на ие и фф всё норм
Iartemiev а можешь скинуть примеры тестов, ты реализовывал через имплицитные ожидания или через эксплицитные. Пробую сейчас делать через эксплицитные, но все равно тесты то проходят то нет.
Примеры тестов через имплицитные:
@Test /*Кнопка «Регистрация» видна и при клике ведет страницу с присутствием тега div.*/
public void LoginPageTestNg_test1() throws Exception {
wd.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
wd.get("http://www.mamba.ru/");
WebElement myDynamicElement = wd.findElement(By.cssSelector("a.ui-btn.ui-btn-big"));
myDynamicElement.click();
wd.findElement(By.cssSelector("div"));
}
@Test /*Кнопка «Вход» видна и при клике ведет страницу с присутствием тега div.*/
public void LoginPageTestNg_test2() throws Exception {
wd.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
wd.get("http://www.mamba.ru/");
WebElement myDynamicElement = wd.findElement(By.cssSelector("a.o-auth"));
myDynamicElement.click();
wd.findElement(By.cssSelector("div"));
}
Эти же тесты через экслицитные ожидания верни ли они? Они то ходят то нет:
@Test
public void LoginPageTestNg_test1() throws Exception {
wd.get("http://www.mamba.ru/");
WebElement myDynamicElement = (new WebDriverWait(wd, 10))
.until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver d) {
return d.findElement(By.cssSelector("a.ui-btn.ui-btn-big"));
}});
myDynamicElement.click();
wd.findElement(By.cssSelector("div"));
}
@Test
public void LoginPageTestNg_test2() throws Exception {
wd.get("http://www.mamba.ru/");
WebElement myDynamicElement = (new WebDriverWait(wd, 10))
.until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver d) {
return d.findElement(By.cssSelector("a.o-auth"));
}});
myDynamicElement.click();
wd.findElement(By.cssSelector("div"));
}
#6
Отправлено 01 ноября 2011 - 02:53
Предполагаю, что в подобных местах:
WebElement myDynamicElement = wd.findElement(By.cssSelector("li.WapMenu a")); myDynamicElement.click();IE подхватывает элемент, помещает его в переменную в первой строчке, но но к моменту выполнения второй строчки элемент уже изменился (например, загружен полностью или изменен каким-то ajax-запросом), отсюда и ошибка:
org.openqa.selenium.StaleElementReferenceException: Element is no longer validМожно попробовать повысить стабильность заменив эти две строчки одной:
wd.findElement(By.cssSelector("li.WapMenu a")).click();
#7
Отправлено 01 ноября 2011 - 08:16
IE по какой-то причине неадекватно определяет состояние страницы как "загружена", и начинает обращаться к элементам раньше, чем они вообще появились на странице или были до конца сформированы (например, какие-то динамически подгружаемые элементы типа списков).
Предполагаю, что в подобных местах:WebElement myDynamicElement = wd.findElement(By.cssSelector("li.WapMenu a")); myDynamicElement.click();IE подхватывает элемент, помещает его в переменную в первой строчке, но но к моменту выполнения второй строчки элемент уже изменился (например, загружен полностью или изменен каким-то ajax-запросом), отсюда и ошибка:org.openqa.selenium.StaleElementReferenceException: Element is no longer validМожно попробовать повысить стабильность заменив эти две строчки одной:wd.findElement(By.cssSelector("li.WapMenu a")).click();
Demetri спасибо за совет. Попоробовал сделать так, но не помогло, часть тестов все равно валится. Нагуглил и нашел, что Алексей Баранцев писал в группу по селениуму такую же проблему : http://groups.google...89e73f1a2765fa6 и как я понимаю писался баг в селениум. Алексей мне ответил вот что:
[11:38:18] Alexei Barantsev: увы, эта проблема решена не полностью
[11:38:24] Alexei Barantsev: периодически она возвращается
[11:38:37] Alexei Barantsev: IE достаточно хитро определяет, менялся ли DOM
Чтож придется тогда автотесты пока не гонять в ИЕ.
#8
Отправлено 01 ноября 2011 - 08:45
IE по какой-то причине неадекватно определяет состояние страницы как "загружена", и начинает обращаться к элементам раньше, чем они вообще появились на странице или были до конца сформированы (например, какие-то динамически подгружаемые элементы типа списков).
Предполагаю, что в подобных местах:WebElement myDynamicElement = wd.findElement(By.cssSelector("li.WapMenu a")); myDynamicElement.click();IE подхватывает элемент, помещает его в переменную в первой строчке, но но к моменту выполнения второй строчки элемент уже изменился (например, загружен полностью или изменен каким-то ajax-запросом), отсюда и ошибка:org.openqa.selenium.StaleElementReferenceException: Element is no longer validМожно попробовать повысить стабильность заменив эти две строчки одной:wd.findElement(By.cssSelector("li.WapMenu a")).click();
Demetri спасибо за совет. Попоробовал сделать так, но не помогло, часть тестов все равно валится. Нагуглил и нашел, что Алексей Баранцев писал в группу по селениуму такую же проблему : http://groups.google...89e73f1a2765fa6 и как я понимаю писался баг в селениум. Алексей мне ответил вот что:
[11:38:18] Alexei Barantsev: увы, эта проблема решена не полностью
[11:38:24] Alexei Barantsev: периодически она возвращается
[11:38:37] Alexei Barantsev: IE достаточно хитро определяет, менялся ли DOM
Чтож придется тогда автотесты пока не гонять в ИЕ.
Алексей посоветовал попоробовать написать автотесты для ИЕ через Actions. Вечером отпишусь что из этого получилось.
#9
Отправлено 02 ноября 2011 - 08:56
@Test
public void LoginPageTestNg_test1() throws Exception {
wd.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
wd.get("http://www.mamba.ru/");
Actions builder = new Actions(wd);
WebElement menubar_more = wd.findElement(By.cssSelector("a.ui-btn.ui-btn-big"));
builder.moveToElement(menubar_more).click().perform();
wd.findElement(By.cssSelector("div"));
}
@Test
public void LoginPageTestNg_test2() throws Exception {
wd.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
wd.get("http://www.mamba.ru/");
Actions builder = new Actions(wd);
WebElement menubar_more = wd.findElement(By.cssSelector("a.o-auth"));
builder.moveToElement(menubar_more).click().perform();
wd.findElement(By.cssSelector("div"));
}
@Test
public void LoginPageTestNg_test3() throws Exception {
wd.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
wd.get("http://www.mamba.ru/");
Actions builder = new Actions(wd);
WebElement menubar_more = wd.findElement(By.cssSelector("div#MenuNav ul li.page-www a"));
builder.moveToElement(menubar_more).click().perform();
wd.findElement(By.cssSelector("div"));
}
@Test
public void LoginPageTestNg_test4() throws Exception {
wd.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
wd.get("http://www.mamba.ru/");
Actions builder = new Actions(wd);
WebElement menubar_more = wd.findElement(By.cssSelector("li.page-top a"));
builder.moveToElement(menubar_more).click().perform();
wd.findElement(By.cssSelector("div"));
}
#10
Отправлено 02 ноября 2011 - 08:56
Иными словами, ожидаем, пока (по мнению IE) DOM не перестанет меняться.
WebElement myDynamicElement = waitForStableElement(driver, By.id("myDynamicElement")); .... public WebElement waitForStableElement(WebDriver driver, final By locator) { return new WebDriverWait(driver, 10).until(new ExpectedCondition<WebElement>(){ public WebElement apply(WebDriver d) { try { return d.findElement(locator); } catch (StaleElementReferenceException ex) { return null; } } }); }
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
#11
Отправлено 02 ноября 2011 - 09:06
Я иногда использую ещё такой способ -- делаем эксплицитное ожидание (с помощью WebDriverWait) до тех пор, пока не перестанет возникать StaleElementException, и только после этого кликаем.
Иными словами, ожидаем, пока (по мнению IE) DOM не перестанет меняться.
WebElement myDynamicElement = waitForStableElement(driver, By.id("myDynamicElement")); .... public WebElement waitForStableElement(WebDriver driver, final By locator) { return new WebDriverWait(driver, 10).until(new ExpectedCondition<WebElement>(){ public WebElement apply(WebDriver d) { try { return d.findElement(locator); } catch (StaleElementReferenceException ex) { return null; } } }); }
Попробую переписать тесты таким вариантом вечером, спасибо.
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных