有没有一种方法可以使用Selenium WebDriver中的JavaScript通过XPath获取元素?


251

我正在寻找类似的东西:

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

我需要使用JS获取元素的innerHTML(要在Selenium WebDriver / Java中使用它,因为WebDriver本身无法找到它),但是如何?

我可以使用ID属性,但并非所有元素都具有ID属性。

[固定]

我正在使用jsoup在Java中完成它。这符合我的需求。


2
顺便说一句,htmland body选择器是多余的,因为DIV必须是BODY的后代(直接或深层),而BODY必须是HTML的子代,因此,只要文档中没有其他DIV元素,就//DIV[1]应该起作用(尽管我很漂亮在XPath表达式上生锈)。等效的DOM是document.getElementsByTagName('div')[1](或0)。
RobG

Answers:


421

您可以使用document.evaluate

计算XPath表达式字符串,并在可能的情况下返回指定类型的结果。

它是W3标准化的,并且完整记录在案:https : //developer.mozilla.org/zh-CN/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


11
魔术数字9是什么意思?最好在这里使用命名常量。
Will Sheppard

5
@WillSheppard XPathResult.FIRST_ORDERED_NODE_TYPE === 9 developer.mozilla.org/en-US/docs/...
yckart

2
我编写了一个getElementByXPath函数,该函数具有对IE的支持,但是目前对一些基本的xpath支持。还有一个功能getElementXpath,它们可以根据我的需要很好地协同工作。gist.github.com/Joopmicroop/10471650
joopmicroop 2014年


var xpathResult = document.evaluate(xpathExpression,contextNode,namespaceResolver,resultType,result);
TechDog


21

对于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/zh-CN/docs/Introduction_to_using_XPath_in_JavaScript




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

确保使用正确的定位器。


1
嗨,Prerit,问题是要根据一个元素的xpath进行选择。您提供的解决方案是按ID选择它。:)
Gaurav Thantry

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

0
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

System.setProperty("webdriver.chrome.driver", "path of your chrome exe");
        WebDriver driver = new ChromeDriver();
        driver.manage().window().maximize();
        driver.get("https://www.google.com");

            driver.findElement(By.xpath(".//*[@id='UserName']")).clear();
            driver.findElement(By.xpath(".//*[@id='UserName']")).sendKeys(Email);

添加描述性答案。您的描述将帮助提问者快速了解您的解决方案。
NickCoder

0

要指出这一点,您可以轻松地使用xapth。使用下面的代码来执行此操作的准确而简单的方法。请尝试提供反馈。谢谢。

JavascriptExecutor js = (JavascriptExecutor) driver;

    //To click an element 
    WebElement element=driver.findElement(By.xpath(Xpath));
    js.executeScript(("arguments[0].click();", element);

    //To gettext

    String theTextIWant = (String) js.executeScript("return arguments[0].value;",driver.findElement(By.xpath("//input[@id='display-name']")));

进一步阅读-https: //medium.com/@smeesheady/webdriver-javascriptexecutor-interact-with-elements-and-open-and-handle-multiple-tabs-and-get-url-dcfda49bfa0f


我相信OP并不需要像您一样的Selenium解决方案,对吗?
ankostis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.