作为自动化测试的一部分,我必须使用xpath从表中获取字段的文本。
字段的层次结构:<td>
是<span>
的父节点,<td>
是<span>
的子节点,如下所示。 <td>
节点包含需要检索的文本值。
<span>Testing</span>
</td>
<span>
上述代码的Xpath为:\ td \ span \ text()
但是,在某些情况下,<td>
节点将不可用。例如,当字段不包含任何颜色时,span节点将不可用,并且文本值将直接显示在<td>Testing</td>
节点下。
<td>
上述代码的Xpath为:\ td \ text()
我想以一种这样的方式编写xpath:如果子节点不存在,则应从<span>
节点检索文本值,否则,请从app:layout_anchor
节点获取文本值节点存在。我可以使用任何xpath函数一次性编写xpath吗?
答案 0 :(得分:0)
您可以同时获得td和跨度。并对它们执行合并。您可以使用|
运算符在xpath中执行联合。可以找到更多信息here
答案 1 :(得分:0)
/td
。当您将其转换为文本时,该文本将是包含或不包含<span>
的单元格中的文本。
XML / HTML旨在允许在文本中添加标记,并且如果与您的兴趣无关,则完全忽略此附加标记的存在。
答案 2 :(得分:0)
您可以组合以下两条路径:
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import org.xml.sax.InputSource;
public class TestXPath {
public static void main(String[] args) throws Exception {
final String span = "<td>Other<span>Testing</span></td>";
final String noSpan = "<td>Other</td>";
final XPath xPath = XPathFactory.newInstance().newXPath();
final DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
final XPathExpression xpathExpr = xPath.compile("/td[span]/span/text()|/td[not(span)]/text()");
System.out.println(xpathExpr.evaluate(db.parse(new InputSource(new StringReader(span))), XPathConstants.STRING));
System.out.println(xpathExpr.evaluate(db.parse(new InputSource(new StringReader(noSpan))), XPathConstants.STRING));
}
}