如何在 python/java 中使用 Selenium 访问 Chrome 的开发工具网络选项卡的请求或摘要的值?

Posted

技术标签:

【中文标题】如何在 python/java 中使用 Selenium 访问 Chrome 的开发工具网络选项卡的请求或摘要的值?【英文标题】:How to access the values of Chrome's Dev tools Network tab's Request or summary using Selenium in python/java? 【发布时间】:2018-04-06 19:19:08 【问题描述】:

我正在使用 chrome 选项来访问使用 selenium 的性能日志记录,我正在尝试编写一个代码来帮助我确定加载完成后 http 请求的总数和页面的大小。手动我们可以使用开发工具的网络选项卡来检查这一点。只需要知道如何访问网络表的值或汇总值。因为性能日志没有给我我需要的汇总值,所以我想写一个代码来获取:

请求总数=

页面的总权重是多少=

如果可能的话。

Screen shot of network tab highlighted the Summary and Request table values that i need to access

capabilities = DesiredCapabilities.CHROME
capabilities['loggingPrefs'] = 'browser': 'DEBUG'
capabilities['loggingPrefs'] = 'performance': 'ALL'
capabilities['perfLoggingPrefs'] = 'enableTimeline': 'true'


driverLocation = "/Users/harisrizwan/Selenium/chrome/chromedriver"
os.environ["chrome.driver"] = driverLocation
chrome_options = Options()
chrome_options.add_argument("headless")

driver= 
webdriver.Chrome(driverLocation,desired_capabilities=capabilities)
driver.implicitly_wait(10)
driver.maximize_window()
baseUrl="www.google.com"
driver.get(baseUrl)

使用 pandas 创建日志的数据框。

df = pd.DataFrame(driver.get_log('performance'))
df.to_clipboard(index=False)

谢谢。

【问题讨论】:

【参考方案1】:

我不确定计算页面的总重量,但可以获取发送到服务器的请求总数

使用https://github.com/lightbody/browsermob-proxy并将代理添加到desired_capabilities,一旦脚本完成,将har文件转储到json并获取所有请求

在python中:

from browsermobproxy import Server
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import json

server = Server('path to the proxy server file')
server.start()
proxy = server.create_proxy()

options = Options()
options.add_argument(f'--proxy-server=proxy.proxy')
driver = webdriver.Chrome('path to chromedriver', desired_capabilities=options.to_capabilities())

proxy.new_har()
driver.get('https://www.google.com')

result = json.dumps(proxy.har)
json_data = json.loads(result)

request= [x for x in json_data['log']['entries']]
server.stop()
driver.close()

【讨论】:

【参考方案2】:

您可以使用performance API 来获取传输的大小。

主页和每个资源的传输大小:

sizes = driver.execute_script("""
  return performance.getEntries()
    .filter(e => e.entryType==='navigation' || e.entryType==='resource')
    .map(e=> ([e.name, e.transferSize]));
  """)

仅为主页传输大小:

size = driver.execute_script("""
  return performance.getEntriesByType('navigation')[0].transferSize;
  """)

主页和资源的总传输大小:

size = driver.execute_script("""
  return performance.getEntries()
    .filter(e => e.entryType==='navigation' || e.entryType==='resource')
    .reduce((acc, e) => acc + e.transferSize, 0)
  """)

【讨论】:

【参考方案3】:

2021 年更新:

这现在可以作为 2020/2021 年 Selenium 4 Beta 的一部分。整个 chrome 开发工具套件可通过本机 selenium API 获得。

见:https://www.selenium.dev/documentation/support_packages/chrome_devtools/

【讨论】:

以上是关于如何在 python/java 中使用 Selenium 访问 Chrome 的开发工具网络选项卡的请求或摘要的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何“悬停”硒中的按钮? [复制]

如何在 python/java 中使用 Selenium 访问 Chrome 的开发工具网络选项卡的请求或摘要的值?

在 urllib2 中使用 selenium 的会话 cookie

selenium---环境配置

硒和无头环境

无法设置 ChromeDriver 实例的 PageLoad