设置 MutationObserver,如何使用 Selenium 在页面加载之前注入 javascript
to set MutationObserver, How to inject javascript before page-loading using Selenium
我正在尝试设置 MutationObserver 以在加载时观察页面变化。
为此,应在页面加载前配置 MutationObserver。
使用 selenium-chrome 驱动程序,找不到为此目的注入 JS 的方法。
我知道 chrome 扩展程序可以做到这一点,但扩展程序无法在无头模式下工作。
就是这个问题。
可以通过 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://whosebug.com/questions")
我们现在可以使用 execute_cdp_cmd(cmd, cmd_args)
在 Selenium 中执行 Chrome Devtools Protocol 命令
from selenium import webdriver
driver = webdriver.Chrome()
driver.execute_cdp_cmd(
"Page.addScriptToEvaluateOnNewDocument",
{
"source": """// Your JavaScript here"""
}
)
driver.get("https://whosebug.com")
driver.quit()
"source"
的参数只是一个字符串。所以你实际上可以在 .js
文件中编写你的脚本(用于语法突出显示)并使用 Python
阅读它
我正在尝试设置 MutationObserver 以在加载时观察页面变化。
为此,应在页面加载前配置 MutationObserver。
使用 selenium-chrome 驱动程序,找不到为此目的注入 JS 的方法。
我知道 chrome 扩展程序可以做到这一点,但扩展程序无法在无头模式下工作。
就是这个问题。
可以通过 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://whosebug.com/questions")
我们现在可以使用 execute_cdp_cmd(cmd, cmd_args)
在 Selenium 中执行 Chrome Devtools Protocol 命令
from selenium import webdriver
driver = webdriver.Chrome()
driver.execute_cdp_cmd(
"Page.addScriptToEvaluateOnNewDocument",
{
"source": """// Your JavaScript here"""
}
)
driver.get("https://whosebug.com")
driver.quit()
"source"
的参数只是一个字符串。所以你实际上可以在 .js
文件中编写你的脚本(用于语法突出显示)并使用 Python