天天看點

ChromeDriver PageLoadStrategy 使用配置

問題引出:

目标網站應用資料分析工具【百度、資料聯盟】等外部分析網站,加載頁面起來懂不懂幾十秒。而ChromeDriver預設是必須等所有的資源加載完,才進我們的頁面分析處理過程中來。這一切非常惱火

技術點:selenium ChromeDriver PageLoadStrategy  Chrome

其中PageLoadStrategy有三種選擇:

(1) NONE: 當html下載下傳完成之後,不等待解析完成,selenium會直接傳回

(2) EAGER: 要等待整個dom樹加載完成,即DOMContentLoaded這個事件完成,僅對html的内容進行下載下傳解析

(3) NORMAL: 即正常情況下,selenium會等待整個界面加載完成(指對html和子資源的下載下傳與解析,如JS檔案,圖檔等,不包括ajax)

1、解決辦法遇敗

網上充斥着:PageLoadStrategy  = eager 能解決問題,嗯是的,不過Chrome不支援這個屬性,隻支援none

//老方法 适用于老版本Selenium
DesiredCapabilities caps = DesiredCapabilities.chrome();
caps.setCapability("pageLoadStrategy", "eager");
           

  兩種實作方式都試一把,結果就是,不管怎麼樣 Chrome就是用了這個eager屬性,一執行就報:

  org.openqa.selenium.WebDriverException: unknown error: cannot parse capability: pageLoadStrategy

#新方法 适用于新版本Selenium
ChromeOptions options = new ChromeOptions();
opt.setPageLoadStrategy( PageLoadStrategy.EAGER );
           

2、柳暗花明-終極解決辦法

DesiredCapabilities caps = DesiredCapabilities.chrome();
caps.setCapability("pageLoadStrategy", "none");
WebDriver mDriver = new ChromeDriver( caps );


driver.navigate().to("https://www.douban.com/");
//因為前文設定了 pageLoadStrategy=none 
//html擷取到後就直接開始分析頁面資訊--可能domcument還未加載完成
//是以需要等待某元素加載才開始,逾時時間為10S
WebDriverWait wait=new WebDriverWait(driver,10);
wait.until(ExpectedConditions.presenceOfElementLocated( By.xpath("/html") ));

//上面這一段代碼就解決了URL一直加載的問題


//我使用的Webmagic java實作
WebElement webElement = webDriver.findElement(By.xpath("/html"));
if( webElement != null ){
	logger.info( "擷取整個頁面資訊失敗,但是業務流程不受影響........" );
	String content = webElement.getAttribute("outerHTML");
	page.setRawText(content);
	page.setHtml(new Html(content, request.getUrl()));
	page.setUrl(new PlainText(request.getUrl()));
	page.setRequest(request);
	webDriverPool.returnToPool(webDriver);			    
}
           

3、參考資訊

Selenium 的頁面加載以及幾種等待的問題

Page load strategy for Chrome driver

Does chrome chrome driver support PageLoadStrategy='eager' for Selenium?

Selenium2(WebDriver)總結(一)---啟動浏覽器、設定profile&加載插件

Selenium 的頁面加載以及幾種等待的問題

Chrome驅動程式的頁面加載政策(更新至Selenium v​​3.12.0)

Page load strategy for Chrome driver (Updated till Selenium v3.12.0)

selenium-chrome-driver

guava

部分資料可能需要翻-牆出去才能.