it-swarm.com.de

Gibt es eine Möglichkeit, Element von XPath mithilfe von JavaScript in Selenium WebDriver abzurufen?

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.

202
pMan

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>
342
yckart

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

$x("some xpath")
132
Dmitry Semenyuk

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

16
Jay

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

9
RobG

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 .

2
Martin Spamer
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.

1
Prerit Jain
**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
0
Alok Patel