选择文本所需的 XPath 建议
Posted
技术标签:
【中文标题】选择文本所需的 XPath 建议【英文标题】:XPath suggestion needed to select text 【发布时间】:2017-08-09 11:21:58 【问题描述】:我有一个带有以下 html 代码的 html 文档:
<!DOCTYPE html>
<html>
<head>
<title>page XYZ</title>
</head>
<body>
<p><b>bold text</b> some more text </p>
<p><b>1.</b> hello<br><b>2.</b> how<br><b>3.</b> do you do?</p><p>some more text in a paragraph.</p>
</body>
</html>
我需要编写 XPath 来打印 3 个点及其文本,即,
1. hello
2. how
3. do you do?
到目前为止我已经尝试过这个:(但它没有打印文本)
List<WebElement> list = driver.findElements(By.xpath("//p/following-sibling::p/b"));
for (int i = 0; i < list.size(); i++)
WebElement el = list.get(i);
String text = el.getText();
System.out.println(text);
请给我建议。
【问题讨论】:
【参考方案1】:要仅选择文本,您应该使用//p[2]/text()
如果你需要打印 1. 2. 3. 你应该使用p[2]/b
如果你需要同时选择你应该使用
//p[2]
作为没有.findElements()
的字符串,然后在您的代码中将其拆分为列表
【讨论】:
//p[2] 有效(所以我接受你的回答),但同样在 Selenium 中,在 XPath 表达式中使用 text() 函数会引发错误,因为选择器无效。【参考方案2】:使用 xpath "(//p[2])/text()"
将返回兄弟<p>
标签内的文本。使用 xpath "(//p[2])/b"
获取粗体数字 1、2、3。
要获得所需的输出,您可以尝试以下操作:
List<WebElement> numberList = driver.findElements(By.xpath("(//p[2])/b"));
List<WebElement> textList = driver.findElements(By.xpath("(//p[2])/text()"));
for(int i = 0; i < textList.size() && i < numberList.size(); i++)
System.out.println(numberList.get(i).getText() + " " + textList.get(i).getText());
【讨论】:
感谢您的回复。 XPath 表达式“(//p[2])/text()”只能作为 XPath 正常工作,但在 Selenium 中它会抛出错误:InvalidSelectorError。以上是关于选择文本所需的 XPath 建议的主要内容,如果未能解决你的问题,请参考以下文章