Xpath是一种表达式语言,常被用于web程序,用以在XML/HTML文档中选择节点。虽然用XPath选择节点远比CSS selectors复杂,但它却无比强大、功能丰富。
Symfony通过DomCrawler组件对XPath提供了支持,该组件一般被用于测试时验证给定响应的内容与预期相匹配。在Symfony 3.2中我们通过添加对评估(evaluate)XPath表达式的支持,改进了对XPath的整合。
实践中,这意味着你可以对由XPath获取的信息进行高级预处理以简化你的测试代码。对下面的HTML代码进行思考:
1 2 3 4 5 6 7 | $html = '<html>
<body>
<span id="article-100" class="article">Article 1</span>
<span id="article-101" class="article">Article 2</span>
<span id="article-102" class="article">Article 3</span>
</body>
</html>'; |
使用substring-after()
这个Xpath函数,你可以得到每个节点之id
属性的数字部分:
1 2 3 4 5 6 7 8 9 10 11 12 | use Symfony\Component\DomCrawler\Crawler;
$crawler = new Crawler();
$crawler->addHtmlContent($html);
$ids = $crawler->filterXPath('//span[contains(@id, "article-")]')
->evaluate('substring-after(@id, "-")');
// $ids = array:3 [
// 0 => "100"
// 1 => "101"
// 2 => "102"
// ] |
使用count()
Xpath函数,如下例,你可以得到包含.article
CSS类的<span>
元素的数量:
1 2 3 4 5 6 7 8 9 | use Symfony\Component\DomCrawler\Crawler;
$crawler = new Crawler();
$crawler->addHtmlContent($html);
$num = $crawler->evaluate('count(//span[@class="article"])');
// $num = array:1 [
// 0 => 3.0
// ] |
阅读MDN Xpath function reference可以快速了解所有可用函数的用法,另外对于W3C官方的推荐内容可参考Xpath and XQuery Functions文档。