Поместите строку с 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.