我在 Chrome 和 Firefox 上使用 python 上的 Selenium。我希望 selenium 等待,直到将特定请求发送到可以位于 devtools 的网络选项卡中的站点。例如名称为“index-24c3e2ca18.js”且请求 URL 为“https://www.wikipedia.org/portal/wikipedia.org/assets/js/index-24c3e2ca18.js”的请求
这可以吗用硒完成吗?如果不能,可以采取什么措施来实现这一目标?
是的,可以使用 Selenium 检测发送到 Chrome 和 Firefox 中站点的特定请求。但是,不能直接使用 Selenium 的“网络”选项卡。Selenium 主要与网页的 DOM 交互,并不直接提供用于监视网络请求的功能。
要实现的目标,需要将 Selenium 与浏览器驱动程序的功能(如 Chrome 的“性能日志”和 Firefox 的“HAR 日志”)结合起来。
以下是如何使用 Python 中的 Selenium 实现此目标的方法:
1. 启用性能日志记录
Chrome:
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--performance-logging-preferences={"traceCategories": "devtools.network"}')
driver = webdriver.Chrome(options=options)
Firefox:
from selenium import webdriver
options = webdriver.FirefoxOptions()
options.set_preference("devtools.netmonitor.har.enable", True)
options.set_preference("devtools.netmonitor.har.pageRef", "page")
driver = webdriver.Firefox(options=options)
2. 导航到页面并捕获日志
driver.get("https://www.wikipedia.org")
# 获取日志
logs = driver.get_log("performance") # Chrome
logs = driver.execute_script("return window.performance.getEntries();") # Firefox
3. 解析日志以查找特定请求
for entry in logs:
# Chrome
if 'message' in entry and 'method' in entry['message']:
message = entry['message']
message_json = json.loads(message)
if message_json['message']['method'] == 'Network.requestWillBeSent':
request = message_json['message']['params']['request']
if request['url'] == "https://www.wikipedia.org/portal/wikipedia.org/assets/js/index-24c3e2ca18.js":
print("找到请求!")
# Firefox
if entry['name'] == 'http' and entry['request']['url'] == "https://www.wikipedia.org/portal/wikipedia.org/assets/js/index-24c3e2ca18.js":
print("找到请求!")
这段代码会分析性能日志,并检查是否存在与提供的 URL 匹配的请求。
替代方法 - 使用 Browsermob-Proxy
另一种方法是使用 Browsermob-Proxy。它是一个代理服务器,允许拦截和检查浏览器与 Web 服务器之间的所有请求和响应。可以使用 Python 库(如“browsermob-proxy-py”)与 Browsermob-Proxy 进行交互。
这些方法使能够使用 Selenium 检测发送到网页的特定请求,即使它不是直接在 DOM 中可见。请记住,网络请求的结构可能会因网站而异,因此可能需要调整用于查找特定请求的条件。
标签:python,selenium-webdriver,webdriver From: 78785642