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);
我有一个 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);