問題引出:
目标網站應用資料分析工具【百度、資料聯盟】等外部分析網站,加載頁面起來懂不懂幾十秒。而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 v3.12.0)
Page load strategy for Chrome driver (Updated till Selenium v3.12.0)
selenium-chrome-driver
guava
部分資料可能需要翻-牆出去才能.