如何使用python selenium获取浏览器网络日志

如何使用python selenium获取浏览器网络日志,python,selenium,selenium-webdriver,selenium-chromedriver,Python,Selenium,Selenium Webdriver,Selenium Chromedriver,我正在尝试使用selenium获取浏览器网络日志以调试请求/响应。你能帮我想个办法吗 我使用的是selenium 3.14.0和最新的Chrome浏览器。要在页面完成加载之前只获取网络日志(页面主要使用期间没有ajax/async网络日志),您可以获取性能日志: 例如,要启用ChromeDriver的性能日志记录 DesiredCapabilities=DesiredCapabilities.chrome(); LoggingPreferences logPrefs=新的LoggingPrefe

我正在尝试使用selenium获取浏览器网络日志以调试请求/响应。你能帮我想个办法吗


我使用的是selenium 3.14.0和最新的Chrome浏览器。

要在页面完成加载之前只获取网络日志(页面主要使用期间没有ajax/async网络日志),您可以获取性能日志:

例如,要启用ChromeDriver的性能日志记录

DesiredCapabilities=DesiredCapabilities.chrome();
LoggingPreferences logPrefs=新的LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE,Level.ALL);
cap.setCapability(CapabilityType.LOGGING_PREFS,logPrefs);
RemoteWebDriver驱动程序=新的RemoteWebDriver(新URL(“http://127.0.0.1:9515"(香港法例第六章),;
还链接到这个完整的示例,其中包含获取性能日志的Java和python代码

同样,重要的是要记住,这只会在页面加载完成之前获取网络请求。之后,驱动程序将只返回相同的性能日志,直到页面重新加载


如果希望在整个页面使用过程中异步获取网络日志,可以使用充当Selenium驱动程序的代理服务器并捕获所有这些网络请求。然后,您可以从BrowserMobProxy生成的HAR文件中获取这些捕获的请求:

//启动代理
BrowserMobProxy代理=新建BrowserMobProxyServer();
代理启动(0);
//获取Selenium代理对象
代理seleniumProxy=ClientUtil.createSeleniumProxy(代理);
//将其配置为所需的功能
DesiredCapabilities=新的DesiredCapabilities();
能力.setCapability(CapabilityType.PROXY,seleniumProxy);
//启动浏览器
WebDriver=新的FirefoxDriver(功能);
//如果需要,启用更详细的HAR捕获(有关完整列表,请参阅CaptureType)
proxy.enableHarCaptureTypes(CaptureType.REQUEST\u内容、CaptureType.RESPONSE\u内容);
//创建一个标签为“yahoo.com”的新HAR
proxy.newHar(“yahoo.com”);
//打开yahoo.com
驱动程序。获取(“http://yahoo.com");
//获取HAR数据
Har=proxy.getHar();

一旦有了HAR文件,它就是一个类似JSON的网络事件列表,您可以使用它。

使用Python和ChromeDriver

要获取网络日志,还需要在python中安装selenium

pip install browsermob-proxy
然后我们需要从下载browsermobproxy zip

将其解压缩到任何文件夹(例如,path/to/extracted_文件夹)。 此文件夹包含browsermob代理二进制文件。在python代码中调用Server()时,我们需要提到这个路径

您需要启动浏览器代理并在chrome驱动程序的chrome选项中配置代理

from browsermobproxy import Server
from selenium import webdriver

server = Server("path/to/extracted_folder/bin/browsermob-proxy")
server.start()
proxy = server.create_proxy()

# Configure the browser proxy in chrome options
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--proxy-server={0}".format(proxy.proxy))
browser = webdriver.Chrome(chrome_options = chrome_options)

#tag the har(network logs) with a name
proxy.new_har("google")
然后,您可以使用selenium导航到页面

browser.get("http://www.google.co.in")
导航之后,您可以从代理服务器获取json格式的网络日志

print(proxy.har) # returns a Network logs (HAR) as JSON 
同样,在退出驱动程序之前,请在结束时停止代理服务器

server.stop()
browser.quit()

使用python+selenium+firefox

除非必须,否则不要设置代理-为了获得出站API请求,我使用了这个答案中的解决方案,但在python中:

你会得到一系列的命令


这允许我查看所有网络请求。我正在使用它从一个请求中解析出一个参数,这样我就可以使用它针对API发出自己的请求。

试试
selenium wire
,我认为这是一种更好的方法,它还提供了
未检测到的chromedriver
,以防机器人检测。

尝试了这个方法,得到了
Keyerror:port
,然后在不更改任何内容的情况下重试,导致
OSError:[WinError 6]如果您在路径方面出错,则句柄无效。
。。。试试这个,第一个例子是java。需要python的例子。对于未来的读者,因为这个问题是在试图找到答案时首先出现的问题之一,所以这就是您要寻找的。这样你就不需要代理了。我想我可以帮你省点时间搜索。请注意,使用
request.response.body
,而不是
request.body
。我不得不进行实验,看看为什么我的身体是空的,并发现文档需要更新。:)
test = driver.execute_script("var performance = window.performance || window.mozPerformance || window.msPerformance || window.webkitPerformance || {}; var network = performance.getEntries() || {}; return network;")

for item in test:
  print(item)