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

Фотография

Нерегулярные ошибки. Selenium Webdriver.

Selenium Webdriver TimeoutException WebDriverException firefox

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

#1 dyarosh

dyarosh

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

  • Members
  • Pip
  • 6 сообщений

Отправлено 14 ноября 2014 - 08:19

Добрый день.

 

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

 

Например:

  • Позавчера: 5 тестов, запускаю эти тесты вручную все в порядке!
  • Вчера error: 2 теста(притом совершено другие), запускаю эти тесты вручную все в порядке!
  • Сегодня error: 4 теста (притом совершено другие), запускаю эти тесты вручную все в порядке!

 

И так с самого начала.

 

Выпадают следующие типы ошибок:

  • org.openqa.selenium.TimeoutException: Timed out after 30 seconds waiting for presence of any elements located by By.selector:
  • org.openqa.selenium.StaleElementReferenceException: Element not found in the cache - perhaps the page has changed since it was looked up
  • org.openqa.selenium.WebDriverException: Unable to bind to locking port 7055 within 45000 ms
  • org.openqa.selenium.WebDriverException: Failed to connect to binary FirefoxBinary(/home/dmitriy/bin/firefox) on port 7063; process output follows: 

Если запускать тесты параллельно, то количество ошибок увеличивается в разы.

 

Большинство ошибок - это подключения к Firefox.  По ним, вроде тут уже говорилось, но решения пока нет. 

 

У меня мало опыта в написание функциональных тестов. И учусь я єтому набивая шишки. Это третий проект на Selenium. Первый был на Selenium IDE for PHP, два других на Selenium Webdriver.

 

Использую:

 

Ubuntu - 13.04

Java - 1.8.0_05

SeleniumWebdriver - 2.44.0 (Java)

Junit - 4.11

FireFox - 33.1

Xvfb - для запуска в фоне.

 

Запускаю: ant 1.9.2 и crontab

 

Как можно решить эти проблемы? Может быть я просто неправильно что-то делаю. Сталкивался кто-то с такими проблемами еще?

 

Спасибо.


  • 0

#2 barancev

barancev

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

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


Отправлено 16 ноября 2014 - 19:37

Нестабильные тесты -- это едва ли не самое ужасное, что может случиться с автотестами. Поэтому надо с этим обязательно бороться.

 

Описанные ошибки относятся к совершенно разным типам.

 

  • org.openqa.selenium.WebDriverException: Unable to bind to locking port 7055 within 45000 ms
  • org.openqa.selenium.WebDriverException: Failed to connect to binary FirefoxBinary(/home/dmitriy/bin/firefox) on port 7063; process output follows: 

 

На старт браузера Firefox отводится 45 секунд. И обе эти ошибки означают, что за это время браузер не смог запуститься.

 

Чтобы понять причину, нужно знать, как происходит запуск. Selenium запускает экземпляры браузер Firefox последовательно, даже если тесты выполняются параллельно. Перед началом запуска браузера поток выставляет блокировку на порт 7055, и пока эта блокировка стоит -- другие потоки ждут. После того, как браузер запустился -- блокировка снимается и какой-то другой поток получает возможность начать запускать свой браузер. После того, как браузеры запущены, они уже работают независимо, команды в них выполняются параллельно, но операция запуска устроена именно так, с блокировкой.

 

В результате, если вы собираетесь запустить, например, 10 браузеров одновременно в 10 потоках, и при этом время старта составляет, скажем, 10 секунд, произойдёт следующее. Один самый удачливый поток поставит блокировку и начнёт запускать браузер. А остальные 9 потоков ждут. Через 10 секунд порт освободится, следующий по удачливости поток захватит его и начнёт запускать браузер. А остальные 8 по прежнему ждут. После того, как это повторится 5 раз, то есть пройдёт 50 секунд, результат будет такой: 4 или 5 потоков успешно запустят браузер, а остальные 5 или 6 упадут с ошибкой.

 

Резюме:

1) Не пытайтесь запустить сразу много браузеров, растягивайте этот процесс по времени. Например, в Java для простоты можно сделать метод, который стартует браузеры, и пометить его модификатором synchronized. Это даст возможность ожидать не 45 секунд, а бесконечно долго, пока стартуют другие браузеры.

2) Если при запуске используется не пустой профиль, а начинённый разными дополнениями -- это значительно увеличивает время старта, постарайтесь это оптимизировать.

3) Используйте машину помощнее :)

 

  • org.openqa.selenium.TimeoutException: Timed out after 30 seconds waiting for presence of any elements located by By.selector:
 

Это означает, что элемент не найден. Если он "иногда находится, а иногда не находится", это скорее всего следствие того, что какое-то предыдущее действие "иногда выполняется, а иногда не выполняется". Например, элемент должен появиться после нажатия какой-то кнопки, но если нажать на кнопку слишком рано (когда она disabled) -- то элемент не появляется. То есть на предыдущем шаге нужно добавить ожидание, и тогда действие будет правильно выполняться и элемент будет всегда успешно находиться.

 

Впрочем, возможна и более простая ситуация -- 30 секунд просто не хватило, и увеличение времени ожидания решит проблему.

 

  • org.openqa.selenium.StaleElementReferenceException: Element not found in the cache - perhaps the page has changed since it was looked up

 

А это означает, что элемент был, но исчез. То есть вы его нашли, сохранили ссылку в какой-то переменной. А когда собрались с этим элементом выполнить какое-то действие -- элемент уже отсутствует в DOM.

 

Как с этим бороться?

1) Не искать элементы "заранее", выполнять поиск непосредственно перед тем, как совершать с ним действия.

2) Не работать с "короткоживущими элементами" (типа всяких сообщений, которые появляются на пару секунд, или индикаторов загрузки)

3) После StaleElementReferenceException делать повторную попытку -- снова нашли элемент и попытались выполнить действие ещё раз.


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

#3 dyarosh

dyarosh

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

  • Members
  • Pip
  • 6 сообщений

Отправлено 19 ноября 2014 - 13:18

Огромное спасибо.

От ошибок:

org.openqa.selenium.TimeoutException

org.openqa.selenium.StaleElementReferenceException

удалось избавиться, доведя до ума тесты...

 

Но с org.openqa.selenium.WebDriverException ничего не могу сделать.

Написал метод getFirefoxDriver():

public class TestCase { 
    @Rule
    public Timeout globalTimeout = new Timeout(300000);

    protected WebDriver driver;

    protected MainPage backendMainPage;

    private static int countOfRetries = 0;

    private final static int maxNumbersOfRetries = 5;

    private final static int timeoutForRetries = 120000;

    public void init() throws Exception {
        this.countOfRetries = 0;
        this.driver = this.getFirefoxDriver();
        driver.manage().window().maximize();
        driver.get("http://192.168.33.10/admin/");
        LoginPage page = new LoginPage(driver);
        backendMainPage = page.submitValidData();
    }

    private WebDriver getFirefoxDriver() throws InterruptedException {
        WebDriver firefoxDriver = null;
        this.countOfRetries++;
        try {
            firefoxDriver = new FirefoxDriver();
        } catch (WebDriverException e) {
            if (this.countOfRetries < this.maxNumbersOfRetries) {
                Thread.sleep(this.timeoutForRetries);
                firefoxDriver = this.getFirefoxDriver();
            }
            Assert.fail("Not connect to Firefox.");
        }
        return firefoxDriver;
    }
}
 
Потом переделывал его:
    private synchronized WebDriver getFirefoxDriver() {
        WebDriver firefoxDriver = null;
        try {
            firefoxDriver = new FirefoxDriver();
        } catch (WebDriverException e) {
            Assert.fail("Not connect to Firefox.");
        }
        return firefoxDriver;
    } 

Результат тот же тесты хаотично валятся. Наверное проблема действительно в производительности машины.

Попробую еще откатить FireFox. 


  • 0

#4 barancev

barancev

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

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


Отправлено 19 ноября 2014 - 13:22

Измерьте, сколько времени выполняется у Вас строчка кода
firefoxDriver = this.getFirefoxDriver();


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

#5 dyarosh

dyarosh

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

  • Members
  • Pip
  • 6 сообщений

Отправлено 19 ноября 2014 - 14:50

Запустил с десяток вручную тестов - все подключились

...
        long startTime = System.currentTimeMillis();
        this.driver = this.getFirefoxDriver();
        long finishTime = System.currentTimeMillis();
        System.out.println(finishTime - startTime);
...

Значения следующие:

7118 ms
7226 ms
6174 ms
5464 ms
6468 ms
4717 ms
7457 ms
9053 ms
6614 ms
7638 ms
6517 ms

А тесты которые не подрубились к FireFox вылитают по таймауту. Указаному в файле TestCase.java

java.lang.Exception: test timed out after 300000 milliseconds 

  • 0

#6 dyarosh

dyarosh

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

  • Members
  • Pip
  • 6 сообщений

Отправлено 27 ноября 2014 - 08:25

Еще раз спасибо и прошу прощение за неверный пост. Поспешил, до конца не проверил.

Удалось избавиться от ошибок соединения с браузером следуя вашему совету...

 

 

 

1) Не пытайтесь запустить сразу много браузеров, растягивайте этот процесс по времени. Например, в Java для простоты можно сделать метод, который стартует браузеры, и пометить его модификатором synchronized. Это даст возможность ожидать не 45 секунд, а бесконечно долго, пока стартуют другие браузеры.

 

 Использование метода getFirefoxDriver(), решило проблему: 

public class TestCase {

    @Rule
    public Timeout globalTimeout = new Timeout(300000);

    protected WebDriver driver;

    protected MainPage backendMainPage;

    public void init() throws Exception {
        this.driver = this.getFirefoxDriver();
        driver.manage().window().maximize();
        driver.get("http://192.168.33.10/admin/");
        LoginPage page = new LoginPage(driver);
        backendMainPage = page.submitValidData();
    }

    private synchronized WebDriver getFirefoxDriver() {
        WebDriver firefoxDriver = null;
        try {
            firefoxDriver = new FirefoxDriver();
        } catch (WebDriverException e) {
            Assert.fail("Not connect to Firefox.");
        }
        return firefoxDriver;
    }
}

  • 0

#7 Gorod_b

Gorod_b

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

  • Members
  • Pip
  • 9 сообщений
  • ФИО:Ваказов Рамис
  • Город:Ульяновск


Отправлено 02 декабря 2014 - 08:32

Была подобная ситуация, когда приложение обновляло страницу чуть ли не каждую секунду, а нужно было проверить 4 столбца в таблице на соответствие ожидаемому результату. Ожиданиями спасался)

WebDriverWait wait = new WebDriverWait(driver, 120);
try {
     wait.until(ExpectedConditions.visibilityOfElementLocated(locator));
     String elementText = driver.findElement(locator).getText();
     return elementText;
} catch (StaleElementReferenceException ex) {
     System.out.println("Web element not found on the page, because the page has been updated. But, you have one more chance to find it, good luck.");
     wait.until(ExpectedConditions.visibilityOfElementLocated(locator));
     String elementText = driver.findElement(locator).getText();
     return elementText;
}

  • 0



Темы с аналогичным тегами Selenium Webdriver, TimeoutException, WebDriverException, firefox

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

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