我正在使用Chrome浏览器测试WebApp。
有时页面会在很长时间后加载。我需要停止下载或限制下载时间。
在FireFox中,我了解PAGE_LOAD_STRATEGY = "eager"
。
铬有类似的东西吗?
P.S。:driver.manage().timeouts().pageLoadTimeout()
有效,但在此之后对Webdriver的任何处理都会引发TimeOutException
。
我需要在停止启动后获取页面的当前URL。
答案 0 :(得分:12)
来自Webdriver规范:
对于导致加载新文档的命令,命令返回的点由会话的页面加载策略确定。
当Page Loading
花费太多时间并且您需要停止下载其他子资源(图片,css,js等)时,您可以通过{{1}更改 pageLoadStrategy
}}
在撰写本文时, webdriver
支持以下值:
<强> pageLoadStrategy
强>
此状态导致Selenium等待整页加载(html内容和子资源下载和解析)。
<强> normal
强>
此状态导致Selenium等待DOMContentLoaded事件(仅下载并解析html内容)。
<强> eager
强>
此策略会导致Selenium在完全收到初始页面内容后立即返回(下载html内容)。
默认情况下,当none
加载页面时,它会跟随 Selenium
normal
。
以下是通过 DesiredCapabilities 类和 ChromeOptions 类的实例配置pageLoadStrategy()
的代码块,如下所示:
使用 DesiredCapabilities 类:
pageLoadStrategy
使用 ChromeOptions 类:
package demo; //replace by your own package name
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
public class A_Chrome_DCap_Options {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
DesiredCapabilities dcap = new DesiredCapabilities();
dcap.setCapability("pageLoadStrategy", "normal");
ChromeOptions opt = new ChromeOptions();
opt.merge(dcap);
WebDriver driver = new ChromeDriver(opt);
driver.get("https://www.google.com/");
System.out.println(driver.getTitle());
driver.quit();
}
}
注意:
中找到详细的讨论package demo; //replace by your own package name import org.openqa.selenium.PageLoadStrategy; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; public class A_Chrome_Options_test { public static void main(String[] args) { System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe"); ChromeOptions opt = new ChromeOptions(); opt.setPageLoadStrategy(PageLoadStrategy.NORMAL); WebDriver driver = new ChromeDriver(opt); driver.get("https://www.google.com/"); System.out.println(driver.getTitle()); driver.quit(); } }
值pageLoadStrategy
,normal
和 {{1 }} 是符合WebDriver W3C Editor's Draft但<{1}}值的要求,因为eager
仍然是 WIP(正在进行中)在 ChromeDriver 实施中。您可以在“Eager” Page Load Strategy workaround for Chromedriver Selenium in Python
参考文献:
答案 1 :(得分:0)
尝试使用显式等待。访问this链接。这可能会有所帮助
尝试此代码:
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);
}
我希望您的问题能够使用上面的代码解决
答案 2 :(得分:0)
在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秒,以使页面成为交互式或完整的