使用 xpath 选择锚点时,Href 属性为空

Posted

技术标签:

【中文标题】使用 xpath 选择锚点时,Href 属性为空【英文标题】:Href attribute empty when selecting anchor with xpath 【发布时间】:2016-06-27 21:22:04 【问题描述】:

我在一个页面中有许多看起来像这样的链接:

<a class="plant_detail_link" href="plants/O7-01111"><h3>O7-01111</h3></a>

我可以使用以下 xpath 在我的页面中选择所有这些链接:

//a[@class='plant_detail_link']

我可以以通常的方式提取每个链接的类等属性:

//a[@class='plant_detail_link']/@class

但是当我尝试使用相同的技术来提取 href 属性值时,我得到一个空列表:

//a[@class='plant_detail_link']/@href

有人知道为什么会出现这种情况吗?

image detailing chrome developer console xpath execution

编辑:

在此处查看完整页面 html - http://pastebin.com/MAjTt86V

【问题讨论】:

您是否尝试过其他浏览器?你的 xpath 在我看来是正确的 xpath //a[@class='plant_detail_link']/@href 是正确的。您可以发布/链接页面的整个 html 吗? 我已将整页粘贴到原帖中 【参考方案1】:

我相信这是一个 chrome 错误。您可以添加 [index].value 以获取结果。换句话说,href 的 $x 确实有效,但由于某种原因它没有在输出中返回结果。

例如,我在此页面的控制台中针对“问题”按钮运行了这些 $x 查询,并得到以下输出:

$x("//a[@id='nav-questions']/@href")
> []
$x("//a[@id='nav-questions']/@href")[0].value
> "/questions"

您可以使用类似的方法来获取可用的值数组:

var links = $x("//a[@target='_blank']/@href");
var linkArr = []; 
for (i in links)  linkArr.push(links[i].value)

或者把它放在一个函数中:

function getHref(selector, value, $x) 
var links = $x("//a[@"+selector+"='"+value+"']/@href");
var linkArr = []; 
for (i in links)  linkArr.push(links[i].value); 
return linkArr; 

getHref("target","_blank", $x);

编辑 不确定这是否会对您有所帮助,但在 chrome 中添加这样的逗号会返回没有 [index].value 的输出:

$x,("//a[@id='nav-questions']/@href")
> "//a[@id='nav-questions']/@href"

您可以尝试在 xpath 选择器中添加一个逗号,但我不确定它是否对您的情况有所帮助。

【讨论】:

这很有用,但我需要一个纯 Xpath 解决方案来返回所有链接的列表。用作 Jmeter 测试的一部分,因此不能使用 javascript 我发现如果你在 $x 后面加上一个逗号,它可以在没有 [index].value 的情况下工作。 $x,("//a[@id='nav-questions']/@href") "//a[@id='nav-questions']/@href"

以上是关于使用 xpath 选择锚点时,Href 属性为空的主要内容,如果未能解决你的问题,请参考以下文章

单击锚点时如何防止滚动到顶部(href =“ID”)

当锚点遇到fixed定位

单击子锚点时,如何防止触发父级的 onclick 事件?

单击锚点时如何存储cookie

设置标题锚点时如何防止标题标签继承超链接样式

WinForm布局