以前我们在div级别有一个包含列名的表,如下所示:
<TABLE id = 'someTablsID'>
<TR>
<TH>
<DIV>&NBSP</DIV>
</TH>
<TH>
<DIV>Last Name</DIV>
</TH>
<TH>
<DIV>First Name</DIV>
</TH>
<TH>
<DIV>Age</DIV>
</TH>
</TR>
</TABLE>
&#13;
我们会有一个元素(表)并做一个 findBy with xpath = th [div [text()]]得到每个标题(是的,有些是空白的)。我们必须按顺序找到它们,因为这是下面值的顺序。现在,我们无法控制的开发人员决定使用span而不是一些,如
<TABLE id = 'someTablsID'>
<TR>
<TH>
<DIV>&NBSP</DIV>
</TH>
<TH>
<DIV>
<SPAN>Last Name</SPAN>
</DIV>
</TH>
<TH>
<DIV>
<SPAN>First Name</SPAN>
</DIV>
</TH>
<TH>
<DIV>
<SPAN>Age</SPAN>
</DIV>
</TH>
</TR>
</TABLE>
&#13;
所以我的findBy将不再工作了。我尝试了几个新的xpaths,包括 th [div [text()] OR div [span [text()]]] 和 th [div [text()] | div [span [text()]]] 但都没有奏效。我在某处读过一些关于不(自我:)但却不理解的事情。
表达我需要的xpath的好方法是什么?
谢谢
答案 0 :(得分:0)
有更深的道路。您未将th
与span
合并,如下所示:
th[div[span[text()]]]
答案 1 :(得分:0)
这个怎么样:
th[div[.//text()[normalize-space()]]]
上述XPath将匹配包含th
元素的div
div
包含非空文本节点(文本节点位于span
内或任何其他元素或直接在div
)内。
答案 2 :(得分:0)
如果您对CSS选择器没问题,可以使用下面的代码打印文本。
List<WebElement> elements = driver.findElements(By.cssSelector("#someTablsID > tr > th > div"));
for (WebElement element : elements)
{
System.out.println(element.getText().trim());
}
我发现自己更容易使用CSS选择器... YMMV。
读取CSS选择器#someTablsID > TR > TH > DIV
:查找具有ID(#)someTablsID
的元素,该元素具有子(&gt;)TR
,其中包含子(&gt;){ {1}}有一个孩子(&gt;)TH
。从那里你可以获取文本,无论它是否真正在孩子DIV
中,你都会得到它。