2015-02-05 48 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

相关问题