Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SeleniumWebDriver(xpath)读取文本_Xpath_Selenium_Webdriver - Fatal编程技术网

使用SeleniumWebDriver(xpath)读取文本

使用SeleniumWebDriver(xpath)读取文本,xpath,selenium,webdriver,Xpath,Selenium,Webdriver,我正在使用selenium使用xpath在我的网页上获取一些文本 页面标签结构如下所示- <span id="data" class="firefinder-match"> Seat Height, Laden <sup> <a class="speckeyfootnote" rel="p7" href="#">7</a> </sup> </span> 我得到结果=座椅高度,满载7 但是我希望避免

我正在使用selenium使用xpath在我的网页上获取一些文本

页面标签结构如下所示-

<span id="data" class="firefinder-match">
    Seat Height, Laden
  <sup>
     <a class="speckeyfootnote" rel="p7" href="#">7</a>
  </sup>
</span>
我得到结果=
座椅高度,满载7

但是我希望避免阅读
标记中的文本,并获得 结果<代码>座椅高度,满载<代码>


请告诉我可以使用哪个xpath表达式来获得所需的结果。

我不知道在Selenium中有什么方法可以做到这一点,所以这里有我的JS解决方案。其思想是获取元素的所有子元素(包括文本节点),然后仅选择文本节点。您可能需要添加一些
.trim()
(或与JS等效的)调用来消除不必要的空格

整个代码:

WebElement elem = driver.findElement(By.id("data"));
String text;
if (driver instanceof JavascriptExecutor) {
    text = ((JavascriptExecutor)driver).executeScript(
            "var nodes = arguments[0].childNodes;" +
            "var text = '';" +
            "for (var i = 0; i < nodes.length; i++) {" +
            "    if (nodes[i].nodeType == Node.TEXT_NODE) {" +
            "        text += nodes[i].textContent;" +
            "    }" +
            "}" +
            "return text;"
            , elem);
}
WebElement elem=driver.findElement(By.id(“数据”);
字符串文本;
if(JavascriptExecutor的驱动程序实例){
text=((JavascriptExecutor)驱动程序).executeScript(
“var nodes=参数[0]。childNodes;”+
“var text=”+
“对于(var i=0;i

为了更好的可读性,只需使用JS

var nodes = arguments[0].childNodes;
var text = '';
for (var i = 0; i < nodes.length; i++) {
    if (nodes[i].nodeType == Node.TEXT_NODE) {
        text += nodes[i].textContent;
    }
}
return text;
var nodes=参数[0]。childNodes;
var text='';
对于(var i=0;i
Um。在纯XPath(能够返回字符串,而不仅仅是WebElements)中,可以执行
//span[@id='data']/text()[1]
。我能想到的一种可能的解决方案是使用JS,第二种是获取整个文本,然后删除子元素中的所有内容。这两种解决方案都相当丑陋,我希望看到更好的解决方案。无论如何,如果在合理的短时间内没有答案,我会发布它。为什么xpath是您唯一的选择?Webdriver通过xpathwell查找元素花费的时间最长。我之所以使用xpath,是因为我对xpath很熟悉。如果有其他办法解决我的问题,我将不胜感激。由于span有id,因此最好使用id而不是xpath。2.cssSelector比xpath快,这就是为什么我建议使用cssSelector而不是xpath。根据下面的帖子,您也不能通过css选择文本节点:。因此,通过css进行选择无助于通过JS获得结果。但我想问一下,是否有类似的事情!xpath中的运算符,通过它我们可以忽略某些标记。但是,它在这种特殊情况下不起作用,因为您仍然选择外部元素,并且默认情况下包含所有子元素。文本节点也是它的子元素,通常的解析器可以得到它。WebDriver不是一个普通的解析器,并且不具有此功能。然而如果您想了解任何特定的XPath,请随时询问。
var nodes = arguments[0].childNodes;
var text = '';
for (var i = 0; i < nodes.length; i++) {
    if (nodes[i].nodeType == Node.TEXT_NODE) {
        text += nodes[i].textContent;
    }
}
return text;