colocar uma string com html / Javascript em selenium webdriver

Eu tenho um documento html na memory como uma string. Ele contém uma tag com um pequeno script que manipula o dom. Agora quero carregar essa página html no selenium webdriver e recuperar a página após o script manipulá-la. Desde que eu tenho o html já na memory, eu não gosto muito da idéia de escrever o html em um arquivo e carregá-lo como arquivo com o driver.get("file://path/to/file") . Então a questão é se existe a possibilidade de alcançar o que eu quero.

Se o webdriver não conseguir, talvez exista uma possibilidade diferente disso?

Aqui vem um exemplo:

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

Obviamente, quero que o webdriver realize a manipulação dom e altere o formulário de acordo com o script.

Note que isto é apenas um exemplo. O script real que eu preciso executar faz coisas muito mais complicadas.

Você poderia carregar uma página vazia, por exemplo:

  

Em seguida, defina seu innerHTML

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

Em seguida, dispare o evento de carga no corpo

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

Então pegue o HTML resultante

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

Usando o Java Selenium 2.4.2 Eu uso o seguinte para replace o html interno de um elemento existente. Eu uso o Apache StringEscapeUtils.escapeJavaScript para escaping do HTML porque esta é uma substituição de JavaScript do HTML interno.

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

Exemplo de html String eu passei.

  

Apenas uma pequena atualização: escape do Ecma Scrip () substitui o escapeJavaScript () em 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:']"), ""); } private static void replaceHTML(By by, String html) { WebElement e = driver.findElement(by); ((JavascriptExecutor) driver).executeScript("arguments[0].innerHTML='" + StringEscapeUtils.escapeEcmaScript(html) + "'", e); } 

Você poderia ligar o jetty embutido . A instância do jetty poderia, então, servir em strings html de memory como páginas da Web por meio de um Servlet / Manipulador.

Se você não quiser criar um arquivo ou carregar um URL antes de poder replace o conteúdo da página, sempre poderá aproveitar o recurso URLs de dados , que suporta HTML, CSS e JavaScript:

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