Ich suche etwas wie:
getElementByXpath(//html[1]/body[1]/div[1]).innerHTML
Ich muss das innerHTML von Elementen mit JS abrufen (um das in Selenium WebDriver/Java zu verwenden, da WebDriver es selbst nicht finden kann), aber wie?
Ich könnte das ID-Attribut verwenden, aber nicht alle Elemente haben das ID-Attribut.
[FIXED]
Ich verwende jsoup, um es in Java zu erledigen. Das passt zu meinen Bedürfnissen.
Sie können document.evaluate
:
Wertet eine XPath-Ausdruckszeichenfolge aus und gibt nach Möglichkeit ein Ergebnis des angegebenen Typs zurück.
Es ist w3-standardisiert und das gesamte Dokumentende: 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 gibt auch eine großartige Einführung in Mozilla Developer Network: https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript#document.evaluate
Alternative Version mit XPathEvaluator
:
function getElementByXPath(xpath) {
return new XPathEvaluator()
.createExpression(xpath)
.evaluate(document, XPathResult.FIRST_ORDERED_NODE_TYPE)
.singleNodeValue
}
console.log( getElementByXPath("//html[1]/body[1]/div[1]") );
<div>foo</div>
In Chrome Dev Tools können Sie Folgendes ausführen:
$x("some xpath")
Für etwas wie $ x von chrome command line api (um mehrere Elemente auszuwählen) versuchen Sie:
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 hat geholfen: https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript
Sie können Javascript document.evaluate verwenden, um einen XPath-Ausdruck im DOM auszuführen. Ich denke, es wird auf die eine oder andere Weise in Browsern unterstützt, zurück zu IE 6.
MDN: https://developer.mozilla.org/en-US/docs/Web/API/Document/evaluate
IE unterstützt stattdessen selectNodes .
MSDN: https://msdn.Microsoft.com/en-us/library/ms754523 (v = vs.85) .aspx
Angenommen, Sie möchten Ihre xpath-Abfragen für Bildschirmkarten entwickeln und 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 dasselbe mit der Web Developer Tools-Konsole tun. In früheren Versionen verwenden Sie x-path-Finder oder Firebug .
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.
**Different way to Find Element:**
IEDriver.findElement(By.id("id"));
IEDriver.findElement(By.linkText("linkText"));
IEDriver.findElement(By.xpath("xpath"));
IEDriver.findElement(By.xpath(".//*[@id='id']"));
IEDriver.findElement(By.xpath("//button[contains(.,'button name')]"));
IEDriver.findElement(By.xpath("//a[contains(.,'text name')]"));
IEDriver.findElement(By.xpath("//label[contains(.,'label name')]"));
IEDriver.findElement(By.xpath("//*[contains(text(), 'your text')]");
Check Case Sensitive:
IEDriver.findElement(By.xpath("//*[contains(lower-case(text()),'your text')]");
For exact match:
IEDriver.findElement(By.xpath("//button[text()='your text']");
**Find NG-Element:**
Xpath == //td[contains(@ng-show,'childsegment.AddLocation')]
CssSelector == .Sprite.icon-cancel