把一个带有html / Javascript的字符串放到selenium webdriver中

我在内存中有一个html文件作为字符串。 它包含一个标记,其中包含一个操作dom的小脚本。 我现在想将该html页面加载到selenium webdriver中,并在脚本操作后返回页面。 由于我已经在内存中使用了html,因此我不喜欢将html写入文件并将其作为文件加载到driver.get("file://path/to/file") 。 所以问题是,如果有可能实现我想要的。

如果webdriver无法做到,也许还有其他可能吗?

这是一个例子:

   function fill(){ var i = "secret" document.forms[0].elements[1].value=i }   

显然,我希望webdriver执行dom操作并根据脚本更改表单。

请注意,这只是一个例子。 我需要运行的实际脚本做了更复杂的事情。

你可以加载一个空页面,例如:

  

然后设置它的innerHTML

 ChromeDriver driver = new ChromeDriver(); driver.get("file://empty-page.html"); String innerHtml = "......"; driver.executeScript("document.innerHTML = " + innerHtml); 

然后在身体上发射加载事件

 driver.executeScript("$(document.body).trigger('load');"); 

然后得到结果HTML

 String result = driver.executeScript("document.body.innerHTML;"); 

使用Java Selenium 2.4.2我使用以下内容替换现有元素的内部html。 我使用Apache StringEscapeUtils.escapeJavaScript来转义HTML,因为这是内部html的JavaScript替换。

  public void replaceHTML(By by, String html) { WebElement e = driver.findElement(by); ((JavascriptExecutor) driver).executeScript("arguments[0].innerHTML='" + StringEscapeUtils.escapeJavaScript(html) + "'", e); } 

示例html我传入的字符串。

  

只是一个小更新:escape Ecma Scrip()在2015年替换了escapeJavaScript()。

 public static void main(String[] args) throws InterruptedException{ driver = new FirefoxDriver(); driver.get("http://dhtmlx.com/docs/products/dhtmlxTree/"); replaceHTML(By.xpath("//*/span[text()='Supported browsers:']"), ""); } private static void replaceHTML(By by, String html) { WebElement e = driver.findElement(by); ((JavascriptExecutor) driver).executeScript("arguments[0].innerHTML='" + StringEscapeUtils.escapeEcmaScript(html) + "'", e); } 

你可以启动嵌入式docker 。 然后,jetty实例可以通过Servlet / Handler在内存html字符串中作为网页提供服务。

如果您不想在替换页面内容之前创建文件或加载URL,则可以始终利用支持HTML,CSS和JavaScript的数据URLfunction:

 ChromeDriver driver = new ChromeDriver(); html_content = """    
Hello World =)
""" driver.get("data:text/html;charset=utf-8," + html_content)