web-dev-qa-db-ja.com

Selenium WebDriverでJavaScriptを使用してXPathで要素を取得する方法はありますか?

私はのようなものを探しています:

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

私は(WebDriverがそれ自体を見つけることができないのでSelenium WebDriver/Javaでそれを使用するために)JSを使用して要素のinnerHTMLを取得する必要がありますが、どのように?

ID属性を使用できますが、すべての要素にID属性があるわけではありません。

[修正]

私はそれをJavaで実行するためにjsoupを使用しています。それは私のニーズに合っています。

196
pMan

document.evaluateを使うことができます:

XPath式の文字列を評価し、可能であれば指定された型の結果を返します。

それは w3標準化された そして全体の文書化: https://developer.mozilla.org/ja-JP/ 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

Mozilla開発者ネットワークについてのすばらしい紹介もあります。 https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript#document.evaluate


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

Chrome Dev Toolsでは、次のことを実行できます。

$x("some xpath")
128
Dmitry Semenyuk

(複数の要素を選択するために)chromeコマンドラインのapiから$ xのようなものを試してください。

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

このMDNの概要が役立ちました。 https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript

15
Jay

DOMでXPath式を実行するには、javascriptの document.evaluate を使用できます。 IE 6に戻るブラウザでは、何らかの方法でサポートされていると思います。

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

IEは代わりに selectNodes をサポートします。

MSDN: https://msdn.Microsoft.com/ja-jp/library/ms754523(v = vs85).aspx

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

正しいロケーターを使用していることを確認してください。

2
Prerit Jain

あなたの目的がスクリーンマップに対するあなたのxpath問い合わせを開発しテストすることであると仮定します。それからどちらか Chromeの開発者用ツール を使ってください。これにより、xpathクエリを実行して一致を表示できます。あるいはFirefox> 9では、 Web Developer Toolsコンソール でも同じことができます。以前のバージョンでは、 x-path-Finder または Firebug を使用してください。

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