Existe uma maneira de obter o elemento por XPath usando JavaScript no WebDriver Selenium?

Estou à procura de algo do género:
getElementByXpath(//html[1]/body[1]/div[1]).innerHTML
{[[2]} eu preciso de obter o innerHTML de elementos usando JS (para usar isso em selênio WebDriver / Java, uma vez que WebDriver não pode encontrá-lo sozinho), mas como?

eu poderia usar o atributo ID, mas nem todos os elementos têm o atributo ID.

[fixa]

estou a usar o jsoup para o fazer em Java. Isso serve para as minhas necessidades. Obrigado pelas respostas. :)

Author: Ben, 2012-05-15

6 answers

Pode usar document.evaluate:

Avalia um texto de expressão do XPath e devolve um resultado do tipo especificado, se possível.

É padronizado pela w3 e um documento completo: https://developer.mozilla.org/en-US/docs/Web/API/Document.evaluate

function getElementByXpath(path) {
  return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}

console.log( getElementByXpath("//html[1]/body[1]/div[1]") );
<div>foo</div>

Https://gist.github.com/yckart/6351935

Há também uma grande introdução na rede de desenvolvedores mozilla: https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript#document.evaluate
 279
Author: yckart, 2015-04-12 00:39:28

Nas Ferramentas do Dev cromado pode executar o seguinte:

$x("some xpath")
 108
Author: Dmitry Semenyuk, 2014-07-15 18:12:59

Para algo como $x da api da linha de comandos chrome (para seleccionar vários elementos) tente:

var xpath = function(xpathToExecute){
  var result = [];
  var nodesSnapshot = document.evaluate(xpathToExecute, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );
  for ( var i=0 ; i < nodesSnapshot.snapshotLength; i++ ){
    result.push( nodesSnapshot.snapshotItem(i) );
  }
  return result;
}

Este resumo MDN ajudou: https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript

 13
Author: Jay, 2014-06-20 16:55:27

Pode usar o documento de javascript .avalie para executar uma expressão XPath no DOM. Acho que é suportado de uma forma ou de outra em navegadores de volta ao IE 6.

MDN: https://developer.mozilla.org/en-US/docs/Web/API/Document/evaluate

IE suporta selectNodes em vez disso.

MSDN: https://msdn.microsoft.com/en-us/library/ms754523(v=vs. 85).aspx

 9
Author: RobG, 2015-04-16 02:43:17
public class JSElementLocator {

    @Test
    public void locateElement() throws InterruptedException{
        WebDriver driver = WebDriverProducerFactory.getWebDriver("firefox");

        driver.get("https://www.google.co.in/");


        WebElement searchbox = null;

        Thread.sleep(1000);
        searchbox = (WebElement) (((JavascriptExecutor) driver).executeScript("return document.getElementById('lst-ib');", searchbox));
        searchbox.sendKeys("hello");
    }
}

Certifica-te que estás a usar o localizador certo para isso.

 3
Author: Prerit Jain, 2018-08-22 08:29:00
Assumindo que o seu objectivo é desenvolver e testar as suas consultas xpath para mapas de ecrã. Então use as ferramentas de desenvolvimento do Chrome . Isto permite-lhe executar a pesquisa do xpath para mostrar as correspondências. Ou no Firefox > 9 Você pode fazer a mesma coisa com a consola de ferramentas de desenvolvimento web . Na versão anterior use x-path-finder ou Firebug .
 2
Author: Martin Spamer, 2013-02-22 15:28:32