Firefox (geckodriver):如何将 JavaScript 函数注入页面,以便它们从 'executeScript' 持续到 return?

Firefox (geckodriver): How do I inject JavaScript functions into a page so that they persist upon return from 'executeScript'?

我有一个 Selenium Java 库,其中包含一个 JavaScript“胶水”库,它使 JavaScript 函数能够抛出序列化的 Java 异常。这样可以更自然地处理异常情况,而无需大量样板文件。

在执行可能想要抛出异常的脚本之前,我通过 executeScript 将这个库注入到闭包中的目标页面中。在 return 之后,闭包中定义的函数将保留在页面上,可供随后执行的脚本用于抛出异常。

此技术在 HtmlUnit、Chrome 和 Edge 上按预期工作。但是,当我在 Firefox 上使用此技术时,所包含的函数不会持续存在。如果我将闭包粘贴到 Developer Tools 的多行编辑器中,函数会保留,但这不是我可以在 Selenium Java 自动化中使用的策略。

有没有其他方法可以用来即时向网页添加功能?是否有 Firefox 设置可以让我使用的技术按预期工作?

我现在使用的脚本源可以在这里找到:https://github.com/sbabcoc/Selenium-Foundation/blob/master/src/main/resources/javaGlueLib.js 正如评论中所指出的,闭包的结构和“命名空间”功能是从这里获得的:https://github.com/jweir/namespace/blob/master/namespace.js

这可能是 Firefox 本身的限制。但我只是猜测。

你试过中间人代理吗?比如https://mitmproxy.org

您需要处于测试浏览器可以信任 MITM 证书的环境中。然后您可以配置 MITM 服务器以将您想要的任何内容注入到请求中。

MITM 的优点是与浏览器无关。

另一种选择可能是使用适用于 Firefox 的 GreaseMonkey。 https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/

我找到了答案。我一直都知道我最初的实现是越界的,Firefox 不会让我得逞的。

解决方案是创建一个script元素,将这个元素的[textContent]设置为我原来的脚本源,并将这个新的script节点附加到head元素上我的目标页面。

var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.textContent = arguments[0];
head.appendChild(script);