14

我正在使用 Selenium ChromeDriver 来测量网页的性能。但默认情况下,Chrome 驱动程序缓存是启用的。

选项--disable-application-cache现已弃用https://code.google.com/p/chromium/issues/detail?id=447206

我也可以每次都初始化一个新的驱动程序实例,但这不是很方便。

我的问题是有办法正确禁用缓存吗?

谢谢!

4

4 回答 4

5

在 Chrome 开发工具网络选项卡中,我们可以通过单击“禁用缓存”复选框来禁用缓存。参考

使用Selenium 4 中的Chrome DevTools 协议支持可以复制相同的行为。

我们可以使用Chrome DevTools 协议中的“Network.setCacheDisabled”

Toggles ignoring cache for each request. If true, cache will not be used.
parameters

cacheDisabled
    boolean

    Cache disabled state.

示例来自 DevTools 的 Selenium 测试

import org.openqa.selenium.devtools.network.Network;

 @Test
  public void verifyCacheDisabledAndClearCache() {

    ChromeDriver driver = new ChromeDriver();
    DevTools devTools = driver.getDevTools();
    devTools.createSession();
   

    devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.of(100000000)));

    driver.get("http://www.google.com");

    devTools.send(Network.setCacheDisabled(true));

    devTools.addListener(Network.responseReceived(), responseReceived -> assertEquals(false, responseReceived.getResponse().getFromDiskCache()));

   driver.get("http://www.google.com");

    devTools.send(Network.clearBrowserCache());

  }

getFromDiskCache() -- 指定请求是否来自磁盘缓存。

对于上面的代码,它将是false

您可以参考selenium 存储库以获取所有示例测试devtools/ChromeDevToolsNetworkTest.java

对于开发工具 Maven 依赖项

<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-devtools -->
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-devtools</artifactId>
    <version>4.0.0-alpha-6</version>
</dependency>
于 2020-07-08T11:48:36.997 回答
3

正如您所提到的,该选项--disable-application-cache现在已弃用。

您可以使用--disk-cache-size并将其设置为zero. 这将强制磁盘缓存使用的最大磁盘空间为零。尽管它可能不适用于某些较旧的浏览器。我成功测试了它的 firefox v67.0.1

有关更多详细信息,请参阅此命令列表:https ://peter.sh/experiments/chromium-command-line-switches/

于 2020-07-15T02:06:42.990 回答
0

在谷歌浏览器中禁用缓存

你没记错。在以下讨论中,已经对标志进行了多次--disable-application-cache讨论:

这两个项目似乎都被某些其他依赖项阻止了。


手动访问Disable cache

可以Disable cacheNetwork选项卡访问 -chrome 的选项。

禁用缓存

打开 DevTools 的键盘快捷键

您可以手动使用以下任一键盘快捷键打开 DevTools

打开 DevTools 的键盘快捷键

您可以在通过 Selenium 在 Chrome 上打开检查(按 F12)中找到相关讨论


通过Selenium支持 ChromeDevtoolsProtocol

随着的可用性,现在可以通过界面获得对ChromeDevtoolsProtocol(CDP)的支持。DevTools

  • v4.0.0.0-alpha-1:通过“DevTools”界面实现对 CDP 的基本支持。
  • v4.0.0.0-alpha-2:为 CDP 添加了额外的域:网络、性能、安全、目标
  • v4.0.0-alpha-3:添加 ApplicationCache、Fetch、Network、Performance、Profiler、ResourceTiming、Security 和 Target CDP 域。
  • v4.0.0-alpha-4:Chrome 调试协议命令现在反映了最新的 CDP 规范。
  • v4.0.0-alpha-6:能够通过全分布式网格代理来自本地端的 CDP 命令。通过“se:options -> cdp”报告要连接的端点

Network.setCacheDisabled

Network.setCacheDisabled可用于切换忽略每个请求的缓存。如果true,则不会使用缓存。

  • 用法:

    devTools.send(Network.setCacheDisabled(true));
    

示范

下面是一个使用的演示setCacheDisabled(true)

环境细节:

  • 硒 v4.0.0-alpha-6
  • ChromeDriver 83.0.4103.39 (2020-05-05)
  • 谷歌浏览器版本 83.0.4103.116
  • 测试NG

代码块:

import java.util.Collections;
import java.util.Optional;

import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.network.Network;
import org.testng.Assert;
import org.testng.annotations.Test;

public class testngBasic {

    @Test
    public void foo() {
        System.setProperty("webdriver.chrome.driver","C:\\WebDrivers\\chromedriver.exe");
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--start-maximized");
        options.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
        options.setExperimentalOption("useAutomationExtension", false);
        ChromeDriver driver = new ChromeDriver(options);
        DevTools devTools = driver.getDevTools();
        devTools.createSession();
        devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.of(100000000)));
        devTools.send(Network.setCacheDisabled(true));
        devTools.addListener(Network.responseReceived(), responseReceived -> Assert.assertEquals(false, responseReceived.getResponse().getFromDiskCache()));
        driver.get("https://www.google.com/");
        devTools.send(Network.clearBrowserCache());
  }
}

结论:断言responseReceived.getResponse().getFromDiskCache()asfalse确定缓存被禁用

于 2020-07-09T13:45:00.040 回答
-3

driver.manage().deleteAllCookies();在导航到需要检查其性能的页面之前,我遇到了类似的情况。这样我们每次加载页面时都会获得一个新的浏览器实例。这适用于 Firefox 和 Chrome 驱动程序,没有任何问题。

希望能帮助到你。

于 2016-02-16T09:49:22.273 回答