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

新手上路,请多包涵

我正在使用 selenium python webdriver 来浏览一些页面。我想在加载和执行任何其他 Javascript 代码之前将 javascript 代码注入页面。另一方面,我需要我的 JS 代码作为该页面的第一个 JS 代码执行。有没有办法通过硒来做到这一点?

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

原文由 Alex 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

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

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

文档未指定代码开始执行的时刻。您可能希望它在 DOM 开始加载之前完成,以便保证只能通过代理或扩展内容脚本路由来满足。

如果您可以使用最少的 harness 检测您的页面,您可能会检测到特殊 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>
    ...

原文由 init_js 发布,翻译遵循 CC BY-SA 3.0 许可协议

Selenium 现在支持 Chrome Devtools Protocol (CDP) API,因此,在每次页面加载时执行脚本真的很容易。这是一个示例代码:

 driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'alert("Hooray! I did it!")'})

它将为每个页面加载执行该脚本。有关这方面的更多信息,请访问:

原文由 Khanh Luong 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题