【问题标题】:Disable cache in Selenium Chrome Driver在 Selenium Chrome 驱动程序中禁用缓存
【发布时间】:2015-07-11 08:46:06
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

  • 我已经看到这在 IE 的情况下工作,你应该找到 Chrome 的类似功能。 capabilities={'ie.ensureCleanSession': True}。使用它,您始终可以确保运行了一个干净的浏览器实例。

标签: java selenium google-chrome google-chrome-devtools selenium4


【解决方案1】:

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

使用 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>

【讨论】:

    【解决方案2】:

    如您所述,--disable-application-cache 选项现已弃用。

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

    请参阅此命令列表了解更多详情:https://peter.sh/experiments/chromium-command-line-switches/

    【讨论】:

      【解决方案3】:

      在谷歌浏览器中禁用缓存

      你没记错。在下面的讨论中,关于标志 --disable-application-cache 的讨论有很多:

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


      手动访问Disable cache

      中的Disable cache 选项可以从 中的网络 选项卡访问。

      打开 DevTools 的键盘快捷键

      您可以手动使用以下任一Keyboard shortcuts for opening DevTools

      您可以在Opening inspect (pressing F12) on Chrome via Selenium找到相关讨论


      ChromeDevtoolsProtocol 支持通过Selenium

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

      • 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)的用法演示:

      环境详情:

      • Selenium v​​4.0.0-alpha-6
      • ChromeDriver 83.0.4103.39 (2020-05-05)
      • 谷歌浏览器版本 83.0.4103.116
      • TestNG

      代码块:

      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() 断言为false 确定缓存已禁用

      【讨论】:

        【解决方案4】:

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

        希望对你有帮助。

        【讨论】:

        • 缓存不仅可以包含 cookie。这不能回答问题,而且是一个不好的解决方法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-17
        • 1970-01-01
        • 2011-09-16
        • 2017-03-10
        • 2022-01-28
        相关资源
        最近更新 更多