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

Фотография

Небольшая часть тестов валятся в ИЕ


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 10

#1 prostooleg1

prostooleg1

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • Город:Москва


Отправлено 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"));
}});
  • 0

#2 Iartemiev

Iartemiev

    Новый участник

  • Members
  • Pip
  • 17 сообщений
  • ФИО:Иван
  • Город:Москва


Отправлено 30 октября 2011 - 19:47

хм, у меня почти также, толоько тесты иногда падают на хроме, на ие и фф всё норм
  • 0

#3 prostooleg1

prostooleg1

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • Город:Москва


Отправлено 30 октября 2011 - 22:34

хм, у меня почти также, толоько тесты иногда падают на хроме, на ие и фф всё норм



Плохо :-)
  • 0

#4 prostooleg1

prostooleg1

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • Город:Москва


Отправлено 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"));
}
  • 0

#5 prostooleg1

prostooleg1

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • Город:Москва


Отправлено 31 октября 2011 - 10:46

Demetri ты же все знаешь, может ты подскажешь, почему в ИЕ часть тестов валится. :-))
  • 0

#6 Demetri

Demetri

    Активный участник

  • Members
  • PipPip
  • 143 сообщений
  • ФИО:Дмитрий
  • Город:Podgorica, MNE


Отправлено 01 ноября 2011 - 02:53

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();

  • 0
Hi! I'm a signature virus. Copy me into your signature to help me spread.

#7 prostooleg1

prostooleg1

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • Город:Москва


Отправлено 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

Чтож придется тогда автотесты пока не гонять в ИЕ.
  • 0

#8 prostooleg1

prostooleg1

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • Город:Москва


Отправлено 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. Вечером отпишусь что из этого получилось.
  • 0

#9 prostooleg1

prostooleg1

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • Город:Москва


Отправлено 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"));
}
  • 0

#10 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 02 ноября 2011 - 08:56

Я иногда использую ещё такой способ -- делаем эксплицитное ожидание (с помощью 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;
          }
        }
      });
    }

  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#11 prostooleg1

prostooleg1

    Активный участник

  • Members
  • PipPip
  • 94 сообщений
  • Город:Москва


Отправлено 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;
          }
        }
      });
    }



Попробую переписать тесты таким вариантом вечером, спасибо.
  • 0


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных