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

luk*_*sch 18 javascript java selenium-webdriver

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

如果webdriver不能这样做,也许还有其他可能吗?

这是一个例子:

<html><head>
<script type="text/javascript">
function fill(){
    var i = "secret"
    document.forms[0].elements[1].value=i
}
</script>
</head><body onload="fill()">
<form method="POST"><input type="hidden" name="he1" value="">
<input type="hidden" name="he2" value="">
</form></body></html>
Run Code Online (Sandbox Code Playgroud)

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

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

lan*_*ava 19

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

<html></html>
Run Code Online (Sandbox Code Playgroud)

然后设置它的innerHTML

ChromeDriver driver = new ChromeDriver();
driver.get("file://empty-page.html");
String innerHtml = "<head>...</head><body onload="...">...</body>";
driver.executeScript("document.innerHTML = " + innerHtml);
Run Code Online (Sandbox Code Playgroud)

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

driver.executeScript("$(document.body).trigger('load');");
Run Code Online (Sandbox Code Playgroud)

然后得到结果HTML

String result = driver.executeScript("document.body.innerHTML;");
Run Code Online (Sandbox Code Playgroud)

  • IE有一个目的......下载chrome;) (7认同)
  • 所有现代浏览器都支持about:blank URI模式.只需调用`driver.get('about:blank');`来加载一个空的HTML页面. (3认同)

jol*_*vin 17

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

ChromeDriver driver = new ChromeDriver();
html_content = """
<html>
     <head></head>
     <body>
         <div>
             Hello World =)
         </div>
     </body>
</html>
"""

driver.get("data:text/html;charset=utf-8," + html_content)
Run Code Online (Sandbox Code Playgroud)

  • 这非常聪明!在这里回答其他问题,它会失败,因为如果你有任何特殊字符,比如 ' ,它就会中断。@moyang 的 base64 版本修复了这个问题。 (2认同)

小智 9

此代码可以加载任何包含 js 和 css 的 html 字符串。

html_bs64 = base64.b64encode(innerHtml.encode('utf-8')).decode()
driver.get("data:text/html;base64," + html_bs64)
Run Code Online (Sandbox Code Playgroud)


小智 6

使用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);
    }
Run Code Online (Sandbox Code Playgroud)

我传入的示例html字符串。

<button type="button" onclick="alert('Hello world!')">Click Me!</button>
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 由于无效的转义字符,我无法使用“ Lance Java's”方法。在等号后添加单引号可解决此问题。

  • 我测试了使用driver.get('about:blank');的“肯尼思·巴尔特里尼克(Kenneth Baltrinic)”的建议;但我无法在屏幕上与基本文档进行交互。在Java中,我必须使用双引号driver.get(“ about:blank”)。我使用Chrome浏览器进行了测试。