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

Зависание WebDriver при выполнение click()/refresh()

webdriver
Теги: #<Tag:0x00007f7b60ef2058>

(GorDi) #1

При работе с елементами сайта возникает необходимость контролировать отрабутку перехода на след. страницу после нажатия на елемент.
Реализовал простенький метод, который сравнивает url до нажатия и после.

 public void autoRetryClickOn(WebElement webElement, String webElementName) {
        this.driver.manage().timeouts().pageLoadTimeout(25, TimeUnit.SECONDS);
        String currentUrl = this.driver.getCurrentUrl();
        try {
            $(webElement).waitWhile(Condition.not(Condition.present), timeOut);
        } catch (Throwable e) { /*NOP*/ }
        for(int i = 0; i <= 10; i++){
            try {
                try {
                    LOG.info("Trying click on '" + webElementName + "'...");
                    webElement.click();
                } catch (TimeoutException e) {
                    LOG.warn("Timed out waiting for page load...");
                    throw  e;
                }
                LOG.info("Click on '" + webElementName + "'");
                if (!this.driver.getCurrentUrl().equals(currentUrl)){
                    driver.manage().timeouts().pageLoadTimeout(120, TimeUnit.SECONDS);
                    return;
                }
                LOG.warn("URL didn't change after '" + i + "' click.Trying refresh web-page...");
            } catch (Exception e) {
                if (!this.driver.getCurrentUrl().equals(currentUrl)){
                    driver.manage().timeouts().pageLoadTimeout(120, TimeUnit.SECONDS);
                    return;
                }
                LOG.warn("URL didn't change after '" + i + "' click.Trying refresh web-page...");
            }
            waitABit(1000);
            LOG.warn("Trying to click again on '"+ webElementName  +"'...");
            webElement.click();
        }
        LOG.error("Can't click on '" + webElementName + "' after 10 attempts!");
        throw new TameAssertionError("Can't click on '" + webElementName + "'!", this.driver);
    }

При запуске теста локально, даже если возникает исключительная ситуация, происходит повторное нажатие на елемент и все корректно отрабатывает. Если тест запускается на Jenkins то все виснет на строчке

 LOG.warn("Timed out waiting for page load...");

Второй день бьюсь над проблемой… Просматривал темы по зависаню вебрайвера при нажатии на елемент, в т.ч. решение с помощью JS. Но вопрос в том, что локально то он, вроде, не зависает…
Пробовал обновить selenium до 2.46, на строчке webElement.click() получаю NoClassDefFoundError.
Подскажите, в чем может быть дело…

P.S. FireFox 38.0.1; selenium 2.45


(GorDi) #2

В общем, сайт https://business.facebook.com/ - продолжает наблюдаться неадекватное поведение. Переодически вешает webdriver не зависимо от действия (click()/refresh/get)… Кто сталкивался - отзовитесь, плз.


(barancev) #3

Странно, что версия 2.45 вообще работает с Firefox 38 – должно крэшить браузер на старте :slight_smile:


(Sergey Korol) #4

Сообщение перенесено в новую тему: Функция определения браузера и совместимости с драйвером


(GorDi) #5

На CI сервере стоит 39 FF, картина таже…
Решил вопрос запуском FF в другом потоке, убиваю поток по таймауту. Пока так.