Firefox in Python Selenium: driver.execute_script attempting to remove text characters with JQuery gives "SecurityError: The operation is insecure"

Firefox in Python Selenium: driver.execute_script attempting to remove text characters with JQuery gives "SecurityError: The operation is insecure"

我正在使用带有 Python 的 Selenium 3.141.0,用于带有 geckodriver 0.29.1 的 Firefox 88.0。

以前,我能够 运行 下面的 JavaScript 执行从网页中删除不需要的字符(在本例中为 ®),如此 answer 所示:

driver.execute_script("var replaced = $('body').html().replace(/(®)/g,''); $('body').html(replaced);")

然而,在最近的某个时候,这不再有效,并出现以下错误:

JavascriptException: Message: SecurityError: The operation is insecure.

据推测,在更新 Selenium、Firefox 或 geckodriver 时,此功能失效 – 除非我抓取的网页(不是我的网页)上的某些内容已更改,这使得脚本无法执行(我不知道网页上的什么可能会导致这种情况。

此问题背后的原因可能是什么,是否可以“覆盖”SecurityError 并执行脚本?

你试过这样的事情吗?

  1. 转到 about:Config 并验证 dom.serviceWorkers.enabled 是否设置为 true
  2. 然后,转到 about:preferences#privacy 并确保取消选中 Delete cookies and site data when Firefox is closed

似乎脚本正在尝试 update/replace 内容 - $('body').html(replaced); 也许更新后它正在尝试下载一些内容,因此引发了错误 SecurityError: The operation is insecure

对于triangulate/debug这个问题,你可以分解脚本执行,查看异常发生在哪条语句上-

  • driver.execute_script("var replaced = $('body').html().replace(/(®)/g,'');")
  • driver.execute_script("$('body').html(替换);")

此外,这种行为似乎与 Selenium/GeckoDriver 本身无关。但是随着 Javascript/JQuery 代码被执行。

我在 JQuery 周围发现了这两个 Whosebug 问题 + 以上错误可能会为您指明正确的方向 -

  • Link 2
  • (this is as mentioned in the ) 在这里您可以尝试通过 Selenium Capabilities 设置 pref 来设置 dom.serviceWorkers.enabled
  • 的值

如果我找到其他方法来处理此行为,将更新此答案

感谢@Xtraterrestrial 在其 中提供帮助我解决问题的链接。我已经奖励了我的赏金。

为清楚起见,我在这里提供我的特定解决方案。

linked answers之一所述,SecurityError的出现显然是因为JavaScript试图修改网页上的不安全元素,例如<input>

使用此 answer 中的代码而不是原来使用的 JQuery 中的代码,脚本现在查找 TextNode 并仅修改那些。

var replaceTextInNode = function(parentNode){
    for(var i = parentNode.childNodes.length-1; i >= 0; i--){
        var node = parentNode.childNodes[i];

        //  Make sure this is a text node
        if(node.nodeType == Element.TEXT_NODE){
            node.textContent = node.textContent.replace(/(®)/g,'')
        } else if(node.nodeType == Element.ELEMENT_NODE){
            //  Check this node's child nodes for text nodes to act on
            replaceTextInNode(node);
        }
    }
};

replaceTextInNode(document.body);

在 Python 中为 Selenium 实现为:

driver.execute_script("var replaceTextInNode = function(parentNode){for(var i = parentNode.childNodes.length-1; i >= 0; i--){var node = parentNode.childNodes[i]; if(node.nodeType == Element.TEXT_NODE){node.textContent = node.textContent.replace(/(®)/g,'')} else if(node.nodeType == Element.ELEMENT_NODE){replaceTextInNode(node); }}}; replaceTextInNode(document.body);")