私はのようなものを探しています:
getElementByXpath(//html[1]/body[1]/div[1]).innerHTML
私は(WebDriverがそれ自体を見つけることができないのでSelenium WebDriver/Javaでそれを使用するために)JSを使用して要素のinnerHTMLを取得する必要がありますが、どのように?
ID属性を使用できますが、すべての要素にID属性があるわけではありません。
[修正]
私はそれをJavaで実行するためにjsoupを使用しています。それは私のニーズに合っています。
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>
Chrome Dev Toolsでは、次のことを実行できます。
$x("some xpath")
(複数の要素を選択するために)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
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
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");
}
}
正しいロケーターを使用していることを確認してください。
あなたの目的がスクリーンマップに対するあなたのxpath問い合わせを開発しテストすることであると仮定します。それからどちらか Chromeの開発者用ツール を使ってください。これにより、xpathクエリを実行して一致を表示できます。あるいはFirefox> 9では、 Web Developer Toolsコンソール でも同じことができます。以前のバージョンでは、 x-path-Finder または Firebug を使用してください。
**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