You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AppleScript调用JavaScript获取Facebook好友链接返回空值的问题

问题解答

1. AppleScript+Safari执行XPath能否直接获取数组/列表结果?

不能直接返回数组。document.evaluate()返回的是XPathResult对象,而非原生JS数组。你需要手动遍历这个结果对象,把每个节点的属性值提取出来存入JS数组,AppleScript才能识别为列表。示例代码如下:

tell application "Safari"
    open location "https://www.facebook.com/friends/list"
    -- 建议延长等待时间或改用更可靠的元素等待逻辑,避免固定延迟导致的加载不完整
    delay 8
    set friendUrls to do JavaScript "
        let result = document.evaluate('//a[contains(@href, \"/profile.php\") or contains(@href, \"/user/\")]', document, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
        let urls = [];
        let node;
        while (node = result.iterateNext()) {
            urls.push(node.href);
        }
        urls;
    " in front document
end tell

这段代码会把符合条件的好友链接存入数组,AppleScript执行后就能拿到完整的URL列表。

2. XPath和document.evaluate参数的问题

(1)XPath的问题

你的原XPath完全依赖DOM层级结构,Facebook页面的DOM会频繁更新,这种硬编码层级的XPath极易失效,这也是它在控制台也拿不到结果的原因——当前页面根本没有匹配该层级的节点。

修改后的带string()的XPath能在控制台拿到值,但AppleScript执行无返回,大概率是因为:

  • 固定delay 5时间太短,好友列表尚未完全渲染;
  • 单个节点的XPath通过document.evaluate()返回的结果需要手动提取值,无法直接返回字符串。

(2)document.evaluate参数的问题

你使用的第四个参数是0(对应XPathResult.UNORDERED_NODE_ITERATOR_TYPE),该类型用于遍历节点集,但原XPath目标是@href属性节点,更合适的做法是将结果类型改为XPathResult.STRING_TYPE,或者直接定位<a>元素再提取href属性——后者比定位属性节点更稳定。

另外需要注意:Facebook好友列表是滚动动态加载的,若要获取全部好友链接,还需添加滚动加载的逻辑,否则只能拿到当前可见区域的好友链接。


内容的提问来源于stack exchange,提问作者d-b

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 20:40:13