一尘不染

Selenium:如何在加载/执行页面的任何其他脚本之前将Javascript插入/执行到页面中?

selenium

我正在使用Selenium python
Webdriver来浏览某些页面。我想在加载和执行任何其他Javascript代码之前向页面中注入JavaScript代码。另一方面,我需要将我的JS代码作为该页面的第一个JS代码执行。Selenium有办法做到吗?

我用谷歌搜索了几个小时,但找不到合适的答案!


阅读 563

收藏
2020-06-26

共1个答案

一尘不染

如果您无法修改页面内容,则可以使用代理或在浏览器中安装的扩展程序中使用内容脚本。在selenium中执行此操作,您将编写一些代码将脚本作为现有元素的子元素之一注入,但是在页面加载之前(驱动程序的get()调用返回时)您将无法运行脚本。

String name = (String) ((JavascriptExecutor) driver).executeScript(
    "(function () { ... })();" ...

该文档未指定代码开始执行的时间。您可能希望在DOM开始加载之前就这样做,以使保证只能通过代理或扩展内容脚本路由来满足。

如果可以使用最少的工具来检测页面,则可以检测到特殊的url查询参数并加载其他内容,但是您需要使用内联脚本来实现。伪代码:

 <html>
    <head>
       <script type="text/javascript">
       (function () {
       if (location && location.href && location.href.indexOf("SELENIUM_TEST") >= 0) {
          var injectScript = document.createElement("script");
          injectScript.setAttribute("type", "text/javascript");

          //another option is to perform a synchronous XHR and inject via innerText.
          injectScript.setAttribute("src", URL_OF_EXTRA_SCRIPT);
          document.documentElement.appendChild(injectScript);

          //optional. cleaner to remove. it has already been loaded at this point.
          document.documentElement.removeChild(injectScript);
       }
       })();
       </script>
    ...
2020-06-26