selenium 如何获得一个完整页面加载的转移大小?

uidvcgyl  于 2022-12-18  发布在  其他
关注(0)|答案(4)|浏览(116)

使用Selenium或JavaScript,您如何获得(通过网络)已加载页面的传输大小(字节),包括所有内容、图像、css、js等?
优选的大小是通过网络的内容的大小,即被压缩的大小,仅用于所做出的请求,等等。
这是你通常可以在开发工具中看到的,在网络状态栏的右边:

如果这不可能,是否可以只获得所有加载资源的总大小(没有压缩等)?这将是一个可接受的替代方案。
浏览器是Firefox,但如果可以使用其他Selenium兼容浏览器,也是可以接受的。
我想这可以通过使用代理来完成,但是有没有任何JS或Selenium的方法来获得这样的信息呢?
如果代理是唯一的方法,那么人们会使用(或实现)哪种方法来简化这样一个任务?只是在设置驱动程序之前用Java实现一些东西?
(The解决方案应该至少在Linux上工作,但最好也能在Windows上工作。我正在通过Java使用Selenium WebDriver。)

rdlzhqv9

rdlzhqv91#

为了便于将来参考,可以通过javascript从浏览器请求此信息。但是,在撰写本文时,还没有浏览器支持此特定数据的此功能。更多信息可以在此处找到。
同时,对于Chrome,您可以从性能日志中解析这些信息。

//Enable performance logging
    LoggingPreferences logPrefs = new LoggingPreferences();
    logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
    capa.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);

    //Start driver
    WebDriver driver = new ChromeDriver(capa);

然后,您可以按如下方式获取此数据

for (LogEntry entry : driver.manage().logs().get(LogType.PERFORMANCE)) {
        if(entry.getMessage().contains("Network.dataReceived")) {
            Matcher dataLengthMatcher = Pattern.compile("encodedDataLength\":(.*?),").matcher(entry.getMessage());
            dataLengthMatcher.find();
            //Do whatever you want with the data here.
        }

如果像您的情况一样,您想知道单个页面加载的细节,可以使用加载前和加载后的时间戳,并且只获取该时间范围内的条目。

lokaqttq

lokaqttq2#

Hakello的回答中提到的性能API现在得到了很好的支持(除了IE和Safari之外),而且使用起来很简单:

return performance
  .getEntriesByType("resource")
  .map((x) => x.transferSize)
  .reduce((a, b) => (a + b), 0);

您可以使用executeScript运行该脚本,以获取自上次导航事件以来下载的字节数。

5ktev3wc

5ktev3wc3#

是的,您可以使用BrowserMobProxy。这是一个Java jar,使用Selenium Proxy跟踪客户端的网络流量。如页面加载持续时间、不同服务的查询字符串等。您可以在www.example.com上找到它bmp.lightbody.net。此API将创建.har文件,其中包含JSON格式的所有这些信息,您可以使用在线工具http://www.softwareishard.com/har/viewer/读取这些信息

roqulrg3

roqulrg34#

我已经用Python实现了这一点,这可能会保存一些时间。

logging_prefs = {'performance' : 'INFO'}    
caps = DesiredCapabilities.CHROME.copy()
caps['loggingPrefs'] = logging_prefs
driver = webdriver.Chrome(desired_capabilities=caps)

要计算总数:

total_bytes = []
for entry in driver.get_log('performance'):
        if "Network.dataReceived" in str(entry):
            r = re.search(r'encodedDataLength\":(.*?),', str(entry))
            total_bytes.append(int(r.group(1)))
            mb = round((float(sum(total_bytes) / 1000) / 1000), 2)

相关问题