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
Selenium 如何跳过父节点(Xpath)中的子节点 软件质素保证及;测试堆栈交换是软件质量控制专家、自动化工程师和软件测试人员的问答网站。加入他们;只需一分钟:_Selenium_Xpath - Fatal编程技术网

Selenium 如何跳过父节点(Xpath)中的子节点 软件质素保证及;测试堆栈交换是软件质量控制专家、自动化工程师和软件测试人员的问答网站。加入他们;只需一分钟:

Selenium 如何跳过父节点(Xpath)中的子节点 软件质素保证及;测试堆栈交换是软件质量控制专家、自动化工程师和软件测试人员的问答网站。加入他们;只需一分钟:,selenium,xpath,Selenium,Xpath,我有上面的HTML标记。我需要从父标记div节点(不包括其子节点)中提取以下文本: 软件质量保证和测试堆栈交换是软件质量控制专家、自动化工程师和软件测试人员的问答网站。加入他们;只需一分钟: 但是,我使用的xpath也从子节点提取Join 下面是我尝试的xpath: //div[@id='blurb']/*[不是(@id='tell-me-more')] 如何编写xpath来仅从父节点提取文本,而不从其子节点提取文本?通常您将使用/div[@id='blurb']/text()[1],但sele

我有上面的HTML标记。我需要从父标记div节点(不包括其子节点)中提取以下文本:

软件质量保证和测试堆栈交换是软件质量控制专家、自动化工程师和软件测试人员的问答网站。加入他们;只需一分钟:

但是,我使用的
xpath
也从子节点
提取
Join

下面是我尝试的
xpath

//div[@id='blurb']/*[不是(@id='tell-me-more')]


如何编写
xpath
来仅从父节点提取文本,而不从其子节点提取文本?

通常您将使用
/div[@id='blurb']/text()[1]
,但
selenium
不支持此语法,因为
xpath
应仅返回
WebElement
,而不返回文本节点

您可以使用
JavaScriptExecutor
获得所需的输出:

<div id="blurb">
   Software Quality Assurance &amp; Testing Stack Exchange is a question and answer site for software quality control experts, automation engineers, and software testers. Join them; it only takes a minute:
   <br>
   <br>
   <a href="/users/signup?ssrc=hero&amp;returnurl=https%3a%2f%2fsqa.stackexchange.com%2f" id="tell-me-more" class="button">Join</a>
</div>

通常您会使用
//div[@id='blurb']/text()[1]
,但是
selenium
不支持这种语法,因为
XPath
应该只返回
WebElement
,而不返回文本节点

您可以使用
JavaScriptExecutor
获得所需的输出:

<div id="blurb">
   Software Quality Assurance &amp; Testing Stack Exchange is a question and answer site for software quality control experts, automation engineers, and software testers. Join them; it only takes a minute:
   <br>
   <br>
   <a href="/users/signup?ssrc=hero&amp;returnurl=https%3a%2f%2fsqa.stackexchange.com%2f" id="tell-me-more" class="button">Join</a>
</div>

我使用下面的xpath找到了答案,它很有效:-

WebElement myDiv = driver.findElement(By.id("blurb"));
JavascriptExecutor jse = (JavascriptExecutor)driver;
String divText = (String) jse.executeScript("return arguments[0].childNodes[0].nodeValue;", myDiv);

在这里,我们省略了内部锚点标记a内部父级div标记我使用下面的xpath找到了答案,它成功了:-

WebElement myDiv = driver.findElement(By.id("blurb"));
JavascriptExecutor jse = (JavascriptExecutor)driver;
String divText = (String) jse.executeScript("return arguments[0].childNodes[0].nodeValue;", myDiv);

在这里,我们省略了内部锚定标记ainside parentdivtag

您的问题更多地落在数据操作/断言方面,而更少地落在为什么这不适用于Selenium方面。只需通过
.contains()
.include()
断言来处理文本。您的问题更多地落在数据操作/断言方面,而较少落在为什么不能使用Selenium方面。只需通过
.contains()
.include()
断言处理文本即可。如果使用相同的逻辑,我希望获得的测试值;childnode的值应该是什么?a的子节点是链接文本。此外,锚元素可以包含
span
…不能将childNodes[0]更改为childNodes[3],因为标记是标记的子元素并获取文本值?您的意思是希望以相同的方式从
获取文本吗?
WebElement
选择器应该简短、简单,不笨重且易于更改。他实际上应该断言/操作他从
div#blubr
容器中获得的数据,就这样。我知道他的问题表明他想要文本,而不是
,但是使用
执行器
来做一些简单的事情显然是过分的,不是一个最佳实践;childnode的值应该是什么?a的子节点是链接文本。此外,锚元素可以包含
span
…不能将childNodes[0]更改为childNodes[3],因为标记是标记的子元素并获取文本值?您的意思是希望以相同的方式从
获取文本吗?
WebElement
选择器应该简短、简单,不笨重且易于更改。他实际上应该断言/操作他从
div#blubr
容器中获得的数据,就这样。我知道他的问题表明他想要不带
的文本,但使用
执行器
来做一些简单的事情显然是过分的,不是一种最佳做法。