javascript 我的Xpath可以使用$x,但不能使用document.evaluate

8nuwlpux  于 2023-04-04  发布在  Java
关注(0)|答案(2)|浏览(174)

我使用AppleScript来控制Safari浏览器。现在我需要在Safari浏览器中使用AppleScript的do javascript来执行Javascript,以评估Xpath并使用AppleScript中的返回值。
这个管用

$x('//div/div/a').map(link => link.href)

但当我尝试这样的事情时

document.evaluate(('//div/div/a').map(link => link.href), document, null, 0, null)

我得到

TypeError: ('//div/div/a').map is not a function. (In '('//div/div/a').map(link => link.href)', '('//div/div/a').map' is undefined)

根据Google的说法,这个错误消息意味着我试图在non-array object上使用map。我想我明白这意味着什么-('//div/div/a')在执行.map(link => link.href)之前没有被计算,但我不知道如何表达这个语句,以便map可以应用于数组。
如果我像这样加上括号

document.evaluate(('//div/div/a').map(link => link.href), document, null, 0, null)

document.evaluate没有得到足够的参数。我也试过

document.evaluate(('//div/div/a'), document, null, 0, null)).map(link => link.href)以为document.evaluate会返回一个数组,但得到的错误消息与上面的map is not a function相同。

我不确定document.evaluate是否给出了一个有意义的结果:

document.evaluate(('//div/div/a'), document, null, XPathResult.ANY_TYPE, null)

XPathResult {resultType: 4, invalidIteratorState: false, iterateNext: function, snapshotItem: function, ANY_TYPE: 0, …} = $3

这基本上不是一个空结果吗?也就是说,不是一个数组?

如何使用'//div/div/a').map(link =〉document.evaluate中的link.href或类似函数,以获得类似数组的数据结构?

更新:我发现了这个https://codereview.stackexchange.com/questions/167571/evaluating-an-xpath-with-document-evaluate-to-get-an-array-of-nodes,它在一个表面上工作-但是我又回到了原来的problem-由于某种原因,我不能使用xpath获得href属性-唯一的解决方案似乎是使用.map(link => link.href)

o8x7eapl

o8x7eapl1#

在XPathResult上使用iterateNext()方法

arr = document.evaluate(('//div/div/a'), document, null, XPathResult.ANY_TYPE, null);
// XPathResult { resultType: 4, invalidIteratorState: false }

a = arr.iterateNext()
// <a class="s-avatar s-avatar__32 s-user-card--avatar" href="/users/2834978/lmc">

a.getAttribute("href")
// "/users/2834978/lmc"
57hvy0tb

57hvy0tb2#

我在Firefox中导航到https://www.facebook.com/zuck/followers,打开JS控制台,并运行以下代码,该代码与您在上面的更新中链接到的页面中的代码相同,但XPath更改了:

var result = document.evaluate("//a[starts-with(@href, 'https://www.facebook.com/profile')]/@href", document, null, XPathResult.ANY_TYPE, null);

var node = result.iterateNext(); 
var nodes = [];
while (node) {
  nodes.push(node);
  node = result.iterateNext();
}
console.log(nodes);

结果是一个href属性数组,其中包含Zuckerberg追随者的个人资料页面的URL。

Array(24) [ 
href="https://www.facebook.com/profile.php?id=100085151235324", 
href="https://www.facebook.com/profile.php?id=100085151235324", 
href="https://www.facebook.com/profile.php?id=100040676620405", 
href="https://www.facebook.com/profile.php?id=100040676620405", 
href="https://www.facebook.com/profile.php?id=100016890221427", 
href="https://www.facebook.com/profile.php?id=100016890221427", 
href="https://www.facebook.com/profile.php?id=100087501701895", 
href="https://www.facebook.com/profile.php?id=100087501701895", 
href="https://www.facebook.com/profile.php?id=100004876967937", 
href="https://www.facebook.com/profile.php?id=100004876967937",
 … ]

这在你的浏览器中对你有效吗?如果不有效,它在不同的浏览器中对你有效吗?

相关问题