2012-05-15 27 views
139

Busco algo como:¿Hay alguna forma de obtener elemento mediante XPath usando JavaScript en Selenium WebDriver?

getElementByXpath(//html[1]/body[1]/div[1]).innerHTML 

que necesito para obtener el innerHTML de los elementos que utilizan JS (para usar en selenio que WebDriver/Java, ya que WebDriver no lo encuentra en sí), pero ¿cómo?

que podría utilizar atributo ID, pero no todos los elementos tienen atributo ID.

[FIJO]

estoy usando jsoup a lograr que se haga en Java. Eso funciona para mis necesidades. Gracias por las respuestas. :)

+2

Por cierto, los selectores 'html' y' body' son superfluos ya que un DIV debe ser un descendiente de BODY (inmediato o más profundo) y BODY debe ser hijo de HTML, siempre que no haya otros elementos DIV en el documento , '// DIV [1]' debería funcionar (aunque estoy bastante oxidado en expresiones XPath). El equivalente DOM es 'document.getElementsByTagName ('div') [1]' (o tal vez '0'). – RobG

Respuesta

230

Puede utilizar document.evaluate:

evalúa una cadena de expresión XPath y devuelve un resultado de la tipo especificado, si es posible.

Es w3-standardized y documentend conjunto: 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

También hay una gran introducción en la red de desarrolladores de Mozilla: https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript#document.evaluate

+6

¿Qué significa el número mágico 9? Sería mejor usar una constante nombrada aquí. –

+3

@WillSheppard 'XPathResult.FIRST_ORDERED_NODE_TYPE === 9' https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript#First_Node – yckart

+0

no funciona la galaxia SIII navegador por defecto –

93

En Chrome Herramientas de desarrollo puede ejecutar el siguiente:

$x("some xpath") 
+0

He jugado con esto y parece funcionar, pero ¿hay alguna documentación para esta función? No encontré nada. – Eric

11

para algo así como $ x desde api línea de comandos de cromo (para seleccionar varios elementos) Proveedores:

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; 
} 

Esta visión general MDN ayudó: https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript

0

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"); 
} 

}

Asegúrese de estar utilizando el localizador adecuado para ello.

Cuestiones relacionadas