355

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

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

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

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

[修繕]

私はjsoupを使ってJavaでそれを成し遂げています。それは私のニーズに合っています。

4

11 に答える 11

592

使用できますdocument.evaluate

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

これはw3 標準化されており、全体が文書化されています: 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

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/bar</div>

于 2013-01-11T18:54:11.327 に答える
29

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

于 2014-06-20T16:55:27.590 に答える
11

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

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

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

MSDN: https://msdn.microsoft.com/en-us/library/ms754523(v=vs.85).aspx

于 2012-05-15T09:05:16.683 に答える
2

あなたの目的がスクリーンマップのためのxpathクエリを開発してテストすることであると仮定します。次に、Chromeの開発者ツールを使用します。これにより、xpathクエリを実行して一致を表示できます。または、Firefox> 9では、 WebDeveloperToolsコンソールで同じことを行うことができます。以前のバージョンでは、x-path-finderまたはFirebugを使用していました。

于 2012-05-15T11:51:43.513 に答える
2
**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
于 2019-04-12T06:15:15.737 に答える