【问题标题】:to set MutationObserver, How to inject javascript before page-loading using Selenium设置 MutationObserver,如何在使用 Selenium 加载页面之前注入 javascript
【发布时间】:2018-04-28 02:46:21
【问题描述】:

我正在尝试设置 MutationObserver 以在加载时观察页面变化。

为此,应在页面加载之前配置 MutationObserver。

使用 selenium-chromedriver,找不到为此目的注入 JS 的方法。

我知道 chrome 扩展程序可以做到这一点,但扩展程序无法在无头模式下工作。

这就是问题所在。

【问题讨论】:

  • 类似的question 的回答建议使用 MitM 代理。

标签: selenium selenium-chromedriver mutation-observers


【解决方案1】:

我们现在可以使用execute_cdp_cmd(cmd, cmd_args) 在 Selenium 中执行 Chrome Devtools 协议命令

from selenium import webdriver

driver = webdriver.Chrome()

driver.execute_cdp_cmd(
    "Page.addScriptToEvaluateOnNewDocument",
    {
        "source": """// Your JavaScript here"""
    }
)

driver.get("https://stackoverflow.com")
driver.quit()

"source" 的参数只是一个字符串。因此,您实际上可以在 .js 文件中编写脚本(用于语法突出显示)并使用 Python 读取它

【讨论】:

    【解决方案2】:

    可以通过 DevTool API 调用 Page.addScriptToEvaluateOnNewDocument

    from selenium import webdriver
    from selenium.webdriver.remote.webdriver import WebDriver
    import json
    
    def send(driver, cmd, params={}):
      resource = "/session/%s/chromium/send_command_and_get_result" % driver.session_id
      url = driver.command_executor._url + resource
      body = json.dumps({'cmd': cmd, 'params': params})
      response = driver.command_executor._request('POST', url, body)
      if response['status']:
        raise Exception(response.get('value'))
      return response.get('value')
    
    def add_script(driver, script):
      send(driver, "Page.addScriptToEvaluateOnNewDocument", {"source": script})
    
    WebDriver.add_script = add_script
    
    
    # launch Chrome
    driver = webdriver.Chrome()
    
    # add a script which will be executed when the page starts loading
    driver.add_script("""
      if (window.self === window.top) { // if main document
        console.log('add script');
      }
      """)
    
    # load a page
    driver.get("https://stackoverflow.com/questions")
    

    【讨论】:

    猜你喜欢
    • 2015-09-30
    • 2014-07-18
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多