python selenium获取body_selenium 获取请求返回内容的解决方案

提出问题

之前我的一篇博客说的是怎么利用 selenium 来做自动化监控。当出现异常时,我们需要记录页面源码、网络请求数据、截图等信息来方便我们诊断问题,基本上就够用了。但是,这两天遇到一个棘手的异常,时不时页面会弹出:“系统繁忙,请稍候再试!”,这时候我们去看网络请求数据,结果状态码全部都是 200,没有其它信息,这压根没法定位不了问题。

这就说明:网络出现异常的时候,仅靠状态码是不够的。我们最好能拿到 http 所有数据,包括:请求头、响应头、请求体、响应体。其中请求头、响应头,可以通过 PERFORMANCE_LOG 拿到,问题都不大。但是请求体与响应体,我们可以拿到么?

分析过程

这个问题困扰了我整整一天的时间,终于解决了。为什么这么困难?

我们先来看 selenium,它为什么不直接支持这个功能呢?因为开发人员觉得这不是他们目标:

we will not be adding this feature to the WebDriver API as it

falls outside of our current scope (emulating user actions).

然后我继续翻网络,发现谷歌的 devtools-protocol 明确是支持的:

那我有没有什么办法能调用这两个方法呢?这就很麻烦了,我根据这篇文章的思路去直连谷歌的 Remote Port。

看这篇文章真的很美,但实际上到我这个项目并不可行,为什么?

原因在于这篇文章所用的 PyChromeDevTools 是基于 WebSocket 的,而且是在请求一个链接后,立即去读取 Chrome 吐出来的响应数据。

而在监控这种场景下,是在请求已经完成之后才会收集 PerformanceLog,然后根据其中的请求 ID 去问 Chrome 要数据。一个是推,一个是拉,这是两种模式。所以非常不幸,解决不了我的问题。

但是给我了我一个思路,我去找找有没有类似 Java 的组件。这时候,我从 GitHub 上找到了 cdp4j,这是一个跟 Chrome 打交道的包,它有一个很迷人的 API:

// 获取请求返回内容

session.getCommand().getNetwork().getResponseBody("requestIdxxxxx");

这个方法我试验了很久,结果仍然不行,调用时一直返回的是:

No resource with given identifier found

我确认了很久,确认 requestId 是没有问题的,为什么拿不到数据?我试了很久,最后放弃了,因为我发现是这样的:

Java 的 Selenium 通过 chromedriver 开启了一个与 Chrome 的 session,cdp4j 是没有办法直接绑到这个 session 上面的(理论上是可能的,但是 cdp4j 的扩展性太差,我实在懒得去改)。这就意味着 chromdriver 的请求数据无法通过 cdp4j 来获取到。

既然 Java 的 Selenium 其实没并有直连 Chrome,而是通过 chromedriver 去跟 Chrome 打交道的。我们能不能从 chromedriver 上看看有没有直接获取 responseBody 的接口呢?

所以,我开始找 chromedriver 的文档,文档真的非常少。不知道从哪里我了解到 chromedriver 是根据 w3c 的协议开发的,我看看 w3c 的 webdriver 协议里能不能找到答案。</

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中使用Selenium获取网页的所有网络请求信息,可以通过使用浏览器的开发者工具来实现。下面是一种获取网络请求信息的基本步骤: 1. 首先,确保你已经安装了Selenium库,并且已经下载了对应浏览器的WebDriver(如ChromeDriver)。 2. 导入必要的库和模块: ```python from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.keys import Keys ``` 3. 创建一个WebDriver对象,并设置相关选项: ```python chrome_options = Options() chrome_options.add_argument("--headless") # 无头模式,可选 driver = webdriver.Chrome(chrome_options=chrome_options) ``` 4. 打开目标网页: ```python driver.get("https://www.example.com") ``` 5. 等待页面加载完成: ```python wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.XPATH, "//body"))) ``` 6. 获取所有网络请求信息: ```python network_entries = driver.execute_script("return window.performance.getEntries()") for entry in network_entries: print(entry["name"]) ``` 以上代码段中,`driver.execute_script()` 方法用于执行JavaScript代码,`window.performance.getEntries()` 可以获取到包含所有网络请求的列表。你可以进一步处理这些网络请求信息,例如提取URL、请求方法、响应码等。 注意:使用Selenium获取网络请求信息可能会受到浏览器的安全策略限制,某些网站可能会阻止获取网络请求信息或者要求进行验证码验证。此外,获取网络请求信息可能会增加页面加载时间,因此请根据实际情况谨慎使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值