2015-02-05 68 views
2

由於某些Ajax請求,我想在頁面源代碼發生變化之後閱讀它。由於我用完了想法,我嘗試了JavaScript,但executeScript()函數始終返回null。任何幫助將非常感激。我想用FirefoxDriver。我的代碼如下:Selenium Java - 通過JavascriptExecutor獲取頁面源代碼

Object test = ((JavascriptExecutor) firefox).executeScript("function getHTML(){ return document.body.innerHTML;} getHTML();"); 
System.out.println(test); 

回答

4

您需要有從腳本返回的東西:

Object test = ((JavascriptExecutor) firefox).executeScript("return document.body.innerHTML;"); 
+0

我以爲通過getHTML()調用我的函數就足夠了。但是你的解決方案有效,所以我非常感激。乾杯! :) – dadoosh 2015-02-05 22:26:53

+0

@alecxe爲什麼OPS代碼不起作用。我可以很容易地在Chrome上進行測試,並且可以正常工作 – Saifur 2015-02-05 22:29:27

+0

@Saifur,添加'return'也可以做到這一點:'function getHTML(){return document.body.innerHTML;} return getHTML();'。 – alecxe 2015-02-05 22:30:31

1

我假設的DOM是不是在就緒狀態和你正在試圖獲取過快速。 我正在修改alecxe的答案,以添加額外的顯式等待,以確保dom處於就緒狀態。 該程序將等待10秒以確保dom處於就緒狀態。

Wait<WebDriver> wait = new WebDriverWait(driver,10); 
wait.until(new Function<WebDriver, Boolean>() { 
    public Boolean apply(WebDriver driver) { 
     return ((JavascriptExecutor) driver).executeScript("return document.readyState;").equals("complete"); 
    } 
}); 

Object test = ((JavascriptExecutor) driver).executeScript("return document.body.innerHTML;"); 
+0

@dadoosh修改。看看 – Saifur 2015-02-07 06:04:06

+0

真的很感謝你的努力,但他們似乎沒有什麼區別。我正在檢查一些屬性值,有趣的是,'driver.findElement()'正確返回它們,而你的和alecxe則不正確。儘管如此,每個findElement()調用都需要大約0.1秒,而且我必須在時間關鍵時刻檢查超過10個元素。我的代碼如下所示,也許我做錯了什麼? – dadoosh 2015-02-07 09:28:46

+0

'Object test = stackOverflowMethod(firefox); Document doc = Jsoup.parse(test.toString()); \t \t \t debugger.println(doc.getElementById(「input_field1」)。attr(「value」)); debugger.println(firefox.findElement(By.xpath(XPaths.INPUT_FIELD_1).getAttribute( 「值」));' 的'stackOverfflowMethod()'明明是100%,你發佈的代碼 *編輯:SRY。我太愚蠢了,以適當的方式在評論中使用代碼標籤 - – dadoosh 2015-02-07 09:37:47