2012-05-15 7 views
139

Ich suche so etwas wie:Gibt es eine Möglichkeit, Element von XPath mit JavaScript in Selenium WebDriver zu erhalten?

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

ich die Innerhtml von Elementen erhalten müssen mit JS (verwenden, die in Selenium WebDriver/Java, seit WebDriver nicht finden können selbst), aber wie?

Ich könnte ID-Attribut verwenden, aber nicht alle Elemente haben ID-Attribut.

[FIXED]

Ich verwende jsoup, um es in Java getan. Das funktioniert für meine Bedürfnisse. Danke für die Antworten. :)

+2

Übrigens sind die 'html'- und' body'-Selektoren überflüssig, da ein DIV ein Abkömmling von BODY (unmittelbar oder tiefer) sein muss und BODY ein Kind von HTML sein muss, vorausgesetzt, es gibt keine anderen DIV-Elemente im Dokument , '// DIV [1]' sollte funktionieren (obwohl ich bei XPath-Ausdrücken ziemlich eingerostet bin). Das DOM-Äquivalent ist 'document.getElementsByTagName ('div') [1]' (oder vielleicht '0'). – RobG

Antwort

230

können Sie document.evaluate verwenden:

Werten einen XPath-Ausdruck String und gibt ein Ergebnis des angegebenen Typs, wenn möglich.

Es ist w3-standardized und ganze documentend: 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

Es ist auch eine gute Einführung in Mozilla Developer Network: https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript#document.evaluate

+6

Was bedeutet die magische Zahl 9? Es wäre besser, hier eine benannte Konstante zu verwenden. –

+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

es funktioniert nicht Samsung Galaxy SIII Standard-Browser –

1

Ihr Ziel Unter der Annahme, auf Ihre XPath-Abfragen für die Bildschirmkarten zu entwickeln und zu testen. Verwenden Sie dann entweder Chrome's developer tools. Auf diese Weise können Sie die xpath-Abfrage ausführen, um die Übereinstimmungen anzuzeigen. Oder in Firefox> 9 können Sie das gleiche mit der Web Developer Tools console tun. In früheren Versionen verwenden Sie x-path-finder oder Firebug.

93

In Chrome Dev-Tools Sie folgende ausführen können:

$x("some xpath") 
+0

Ich habe damit herumgespielt und es scheint zu funktionieren, aber gibt es irgendeine Dokumentation für diese Funktion? Ich habe nichts gefunden. – Eric

11

Für so etwas wie $ x aus Chrom-Befehlszeile api (mehrere Elemente auswählen) versuchen:

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

Diese MDN Übersicht geholfen: 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"); 
} 

}

Stellen Sie sicher, dass Sie den richtigen Locator dafür verwenden.

Verwandte Themen