Стратегия загрузки страницы для драйвера Chrome (обновлена до Selenium v3.12.0)
Я использую браузер Chrome для тестирования WebApp.
Иногда страницы загружаются после очень долгого времени. Мне нужно было прекратить загрузку или ограничить время их загрузки.
В FireFox я знаю о PAGE_LOAD_STRATEGY = "eager"
,
Есть ли что-то похожее на хром?
PS: driver.manage().timeouts().pageLoadTimeout()
работает, но после этого любое обращение к Webdriver кидает TimeOutException
, Мне нужно получить текущий URL страницы после остановки его загрузки.
4 ответа
Из спецификации Webdriver:
Для команд, вызывающих загрузку нового документа, точка, в которой возвращается команда, определяется стратегией загрузки страницы сеанса.
когда Page Loading
занимает слишком много времени, и вам нужно прекратить загрузку дополнительных субресурсов (изображений, CSS, JS и т. д.), вы можете изменить pageLoadStrategy
сквозь webdriver
,
На момент написания статьи pageLoadStrategy
поддерживает следующие значения:
normal
Это состояние заставляет Selenium ждать полной загрузки страницы (загруженный и проанализированный html-контент и субресурсы).
eager
Это состояние заставляет Selenium ожидать события DOMContentLoaded (загружается и анализируется только HTML-контент).
none
Эта стратегия приводит к тому, что Selenium возвращается сразу после полного получения исходного содержимого страницы (загрузка содержимого html).
По умолчанию, когда Selenium
загружает страницу, следует normal
pageLoadStrategy
,
Вот блок кода для настройки pageLoadStrategy()
через экземпляр класса DesiredCapabilities и ChromeOptions Class следующим образом:
Использование класса DesiredCapabilities:
import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxOptions; import org.openqa.selenium.remote.DesiredCapabilities; public class myDemo2 { public static void main(String[] args) throws Exception { System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe"); DesiredCapabilities dcap = new DesiredCapabilities(); dcap.setCapability("pageLoadStrategy", "normal"); FirefoxOptions opt = new FirefoxOptions(); opt.merge(dcap); WebDriver driver = new FirefoxDriver(opt); driver.get("https://www.google.com/"); System.out.println(driver.getTitle()); driver.quit(); } }
Использование класса ChromeOptions:
import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxOptions; import org.openqa.selenium.PageLoadStrategy; public class myDemo1 { public static void main(String[] args) throws Exception { System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe"); FirefoxOptions opt = new FirefoxOptions(); opt.setPageLoadStrategy(PageLoadStrategy.NORMAL); WebDriver driver = new FirefoxDriver(opt); driver.get("https://www.google.com/"); System.out.println(driver.getTitle()); driver.quit(); } }
Примечание:
pageLoadStrategy
ценностиnormal
,eager
а такжеnone
является обязательным требованием в соответствии с черновиком WebDriver W3C Editor, ноpageLoadStrategy
значение какeager
по-прежнему WIP (работа в процессе) в реализации ChromeDriver. Подробное обсуждение вы можете найти в обходе стратегии загрузки страницы "Стремление" для Chromedriver Selenium в Python.
Рекомендации:
Для Селена 4 и Питона
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.page_load_strategy = 'none'
driver = webdriver.Chrome(options=options)
driver.get("http://www.google.com")
driver.quit()
Более подробную информацию можно найти здесь https://www.selenium.dev/documentation/webdriver/capabilities/shared/#none
В C#, поскольку PageLoadStrategy.Eager, похоже, не работает для Chrome, я просто написал его сам с помощью WebDriverWait. Установите для PageLoadStrategy значение none, и тогда это в основном переопределит его:
new WebDriverWait(_driver, TimeSpan.FromSeconds(20))
.Until(d =>
{
var result = ((IJavaScriptExecutor) d).ExecuteScript("return document.readyState");
return result.Equals("interactive") || result.Equals("complete");
});
Вы просто добавляете в свой драйвер chrome в качестве параметра, и в моем случае TimeSpan устанавливается на максимум 20 секунд. Таким образом, будет ждать максимум 20 секунд, пока страница не станет интерактивной или полной
Попробуйте использовать явное ожидание. Посетите эту ссылку. Это может быть полезно
Попробуйте также этот код:
WebDriver driver = new FirefoxDriver();
String startURL = //a starting url;
String currentURL = null;
WebDriverWait wait = new WebDriverWait(driver, 10);
foo(driver,startURL);
/* go to next page */
if(driver.findElement(By.xpath("//*[@id='someID']")).isDisplayed()){
String previousURL = driver.getCurrentUrl();
driver.findElement(By.xpath("//*[@id='someID']")).click();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
ExpectedCondition e = new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
return (d.getCurrentUrl() != previousURL);
}
};
wait.until(e);
currentURL = driver.getCurrentUrl();
System.out.println(currentURL);
}
Я надеюсь, что ваша проблема будет решена с помощью приведенного выше кода