Дождитесь загрузки файла Javascript в Selenium 2 - PullRequest
0 голосов
/ 28 июля 2011

Я использую Selenium 2 для проверки пользовательского интерфейса моего сайта.Мне нужно проверить, что нажатие кнопки дает некоторый результат.В 1 из каждых 10 или около того тестовых прогонов Selenium даже не нажимает кнопку.Там нет ошибок распечатаны.В JS нет ничего плохого, потому что я могу вручную нажать на кнопку после того, как Selenium не сможет ее щелкнуть.

В самом простом виде мой HTML выглядит так:в конце тела, чтобы медленно загружаемый файл JS не блокировал всю страницу.Файл JS определяет функцию clickIt.

function clickIt() {
   $('button').addClassName('beenClicked');
}

Java:

WebElement button = driver.findElement(By.xpath("//a[@id='button']"));
button.click();

Моя гипотеза о том, почему он терпит неудачу 1 из 10 раз, состоит в том, что Selenium не ждет загрузки файла JS перед нажатием кнопки.Если это правда, как мне ждать, пока этот файл JS загрузится и выполнится?

Ответы [ 3 ]

2 голосов
/ 28 июля 2011

Просмотр WebDriverWait

Проверьте, есть ли функция

JavascriptExecutor js = (JavascriptExecutor) driver; 
Boolean isLoaded = (Boolean)js.executeScript("return typeof window.yourFunctionName === 'function'", null);
0 голосов
/ 18 мая 2016
public boolean waitForJStoLoad(WebDriver driver) {
    WebDriverWait wait = new WebDriverWait(driver, 30);

    // wait for jQuery to load
    ExpectedCondition<Boolean> jQueryLoad = new ExpectedCondition<Boolean>() {
        @Override
        public Boolean apply(WebDriver driver) {
            try {
                return ((Long)((JavascriptExecutor) driver)
                        .executeScript("return jQuery.active") == 0);
            }
            catch (Exception e) {
                return true;
            }
        }
    };

    // wait for Javascript to load
    ExpectedCondition<Boolean> jsLoad = new ExpectedCondition<Boolean>() {
        @Override
        public Boolean apply(WebDriver driver) {
            return ((JavascriptExecutor) driver)
                    .executeScript("return document.readyState")
                    .toString().equals("complete");
        }
    };
    return wait.until(jQueryLoad) && wait.until(jsLoad);
}
0 голосов
/ 23 сентября 2013
JavascriptExecutor js = (JavascriptExecutor) driver; 
Boolean isLoaded = (Boolean)js.executeScript(
      "return typeof window.yourFunctionName === 'function'", null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...