2015-05-21 2 views
3

Я работаю над автоматизацией сайта, который имеет несколько ссылок, которые загружают новые страницы через событие JS. В принципе, есть элементы, которые можно щелкнуть, щелкнув по одному, вызывает запуск JavaScript, и это приводит к отправке формы и маршрутизации на новую страницу.Как сделать Selenium WebDriver ждать загрузки страницы, когда новая страница загружается через событие JS

Теперь, если бы это были только стандартные HTML-ссылки, было бы без проблем, поскольку Selenium достаточно умен, чтобы сказать, что есть новая страница и ждать, чтобы что-то делать. Но так хорошо, что Selenium не может сказать, что клики в этом экземпляре приводят к загрузке новых страниц, поэтому они не ждут и просто продолжаются. Таким образом, он не дожидается новой страницы, пытается найти элементы, которых нет, и мои тесты не работают. Облом.

В качестве временного решения, я просто Приостановка программу в течение трех секунд, как так:

oldPageDriver.clickThatButton(); 

try { 
    Thread.sleep(3000); 
} catch(InterruptedException ex) { 
    Thread.currentThread().interrupt(); 
} 

newPageDriver = new NewPageDriver(driver); 
newPageDriver.doStuffOnNewPage(); 

И это работает, вроде. Мне это не нравится, потому что оно «взломанно» и просто прерывает программу, а не делает что-то умнее. Поскольку задержка жестко закодирована через три секунды, я получаю сбои, если ссылка работает, но просто медленная. Я рассматривал что-то вроде неявного ожидания, но это делает то же самое, и я не нашел надежного, работоспособного ответа на Java где-нибудь после значительного поиска.

Итак, может ли кто-нибудь предложить способ обойти это? В частности, как заставить Selenium знать, что ожидается новая страница, и ждать, пока она будет доступна?

+0

Возможный дубликат [Selenium wait, пока документ не будет готов) (http://stackoverflow.com/questions/15122864/selenium-wait-until-document-is-ready) – Saifur

ответ

3

Явные ожидания - это то, что вам нужно;

http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp

Вы можете непосредственно добавить это к тесту, или вы можете высушить его, особенно если есть общее ожидание ожидание, таких как исчезновение значка прядения.

Вы можете расширить метод щелчка, чтобы всегда ждать после нажатия или, если следующие объекты страницы, добавить метод wait_until_loaded к базовому классу страницы. Там много других действительных подходов, но в зависимости от того, как AUT реализуется

3

Simple ready2use сниппета, прекрасно работает для меня

static void waitForPageLoad(WebDriver wdriver) { 
    WebDriverWait wait = new WebDriverWait(wdriver, 60); 

    Predicate<WebDriver> pageLoaded = new Predicate<WebDriver>() { 

     @Override 
     public boolean apply(WebDriver input) { 
      return ((JavascriptExecutor) input).executeScript("return document.readyState").equals("complete"); 
     } 

    }; 
    wait.until(pageLoaded); 
} 
+0

Совершенный рабочий пример Java. В Java 8+ раз следует отметить, что для этого используется com.google.common.base.Predicate, а не Java8 native Predicates, но это детали. – Bachi

5

Ждать document.ready случае не все исправления этой проблемы , потому что этот код по-прежнему находится в состоянии гонки: иногда этот код запускается до того, как событие клика обработано, так что это прямо возвращается, так как браузер еще не начал загружать новую страницу.

После некоторого поиска я нашел сообщение на Obay the testing goat, у которого есть решение этой проблемы. C# код для этого решения является то вроде этого:

IWebElement page = null; 
... 
public void WaitForPageLoad() 
{ 
    if (page != null) 
    { 
     var waitForCurrentPageToStale = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); 
     waitForCurrentPageToStale.Until(ExpectedConditions.StalenessOf(page)); 
    } 

    var waitForDocumentReady = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); 
    waitForDocumentReady.Until((wdriver) => (driver as IJavaScriptExecutor).ExecuteScript("return document.readyState").Equals("complete")); 

    page = driver.FindElement(By.TagName("html")); 

} 

` я огонь этот метод непосредственно после driver.navigate.gotourl, так что он получает ссылку на страницу как можно скорее. Получайте удовольствие от этого!

+0

Отлично, я не могу не сказать Спасибо! – AsValeO

Смежные вопросы