【问题标题】:How to use XPath in a newly opened window?如何在新打开的窗口中使用 XPath?
【发布时间】:2022-01-08 23:08:11
【问题描述】:

使用下面的代码(用于小书签),我试图打开一个新窗口,查找某些跨度元素,然后单击它们中的每一个。但是,我无法通过 XPath 访问新窗口的代码。

  • 直接在新标签中插入clickElem function 的代码(复制和粘贴)效果很好
  • CORS 不是问题,因为它是相同的域/子域/协议
  • 我也一直关注this answer

JavaScript:

const w = window.open('https://example.com', 'Example', 'width=500, height=500');
w.clickElem = () => {
    const xpath = '//span[text()="Click here"]';
    const selectedNodeElements = w.document.evaluate(xpath, document, null, XPathResult.ANY_TYPE, null);
    let currentNode = selectedNodeElements.iterateNext();
    while (currentNode) {
        currentNode.click();
        currentNode = selectedNodeElements.iterateNext();
    }
}
setTimeout(w.clickElem, 8000);

当我尝试通过currentNode.textContent 访问文本时,我收到以下错误:

"Error in protected function: Cannot read properties of null (reading 'textContent')"

感谢每一个提示!

【问题讨论】:

  • 如果您使用不同的协议(例如 https 而不是 http)或不同的子域(例如 www),Cors 将成为问题。端口也必须相同。
  • 在我的例子中,它是同一个域、子域和协议
  • 只要在window文档上使用查询选择器然后看看你是否可以访问dom。
  • 这很好,我可以通过查询选择器访问新打开的窗口中的元素

标签: javascript xpath


【解决方案1】:

你确定你已经在你的标签中了吗?我在想你需要什么来获得像this one 这样的活动标签?

【讨论】:

  • 这看起来像是评论,而不是对问题的直接回答。您可以考虑下次将此添加为评论,而不是将其作为答案发布。
  • 这看起来像是评论,而不是对问题的直接回答。您可以考虑下次将此添加为评论,而不是将其作为答案发布。
  • 谢谢!是的,我也认为缺少对窗口的引用,但我不知道在哪里。尝试在新打开的选项卡中调用警报,例如正在运行。不幸的是,我不能使用 Chrome 扩展 API,因为它必须作为书签而不是扩展程序运行。
【解决方案2】:

在反复检查我的代码并遇到this answer 之后,我终于发现了自己的错误。 .iterateNext() 不起作用,因为上下文节点被错误地设置为 document。相反,它应该是w.document 来引用新打开的窗口。

const selectedNodeElements = w.document.evaluate(xpath, w.document, null, XPathResult.ANY_TYPE, null);
    

【讨论】:

    猜你喜欢
    • 2018-03-03
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多