Поместите строку с html/Javascript в selenium webdriver

У меня есть html-документ в памяти как строка. Он содержит тег <script> с небольшим script, который управляет dom. Теперь я хочу загрузить эту страницу html в selenium webdriver и вернуть страницу после script. Поскольку у меня есть 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>

Очевидно, что я хочу, чтобы webdriver выполнил манипуляцию dom и изменил форму в соответствии с script.

Примечание это просто пример. Фактический script, который мне нужно запустить, делает гораздо более сложные вещи.

Ответ 1

Вы можете загрузить пустую страницу, например:

<html></html>

И затем установите его innerHTML

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

Затем запустите событие загрузки на теле

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

Затем получим полученный HTML

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

Ответ 2

Использование Java Selenium 2.4.2 Я использую следующее, чтобы заменить внутренний html существующего элемента. Я использую Apache StringEscapeUtils.escapeJavaScript, чтобы избежать HTML, потому что это замена JavaScript для внутреннего html.

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

Пример html Строка, в которую я прошел.

<button type="button" onclick="alert('Hello world!')">Click Me!</button>

Ответ 3

Просто небольшое обновление: escape Ecma Scrip() заменяет escapeJavaScript() в 2015 году.

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:']"), "<button type=\"button\"  onclick=\"alert('Hello World!!')\">Click Me!</button>");
}

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

}

Ответ 4

Вы можете запустить встроенный причал. Экземпляр причала может затем служить в html-строках памяти в виде веб-страниц через Servlet/Handler.