把一个带有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)