禁用Selenium Chrome Driver中的缓存

14
我正在使用 Selenium ChromeDriver 测量网页的性能。但是默认情况下,Chrome driver 启用了缓存。
选项 --disable-application-cache 现在已被弃用 https://code.google.com/p/chromium/issues/detail?id=447206 此外,我可以每次初始化一个新的驱动程序实例,但这并不是非常方便。
我的问题是是否有方法正确地禁用缓存?
谢谢!

我曾经在IE的情况下看到过这种方法,你应该可以找到类似Chrome的功能。capabilities={'ie.ensureCleanSession': True}。使用这个方法,你总是确保运行一个干净的浏览器实例。 - Abhinav
4个回答

5

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

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

这个例子来自于Selenium DevTools测试

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

有关Dev Tools 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>

3

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

您可以使用--disk-cache-size并将其设置为zero。这将强制磁盘缓存使用的最大磁盘空间为零。虽然它可能无法在一些较旧的浏览器上工作,但我已经成功地在火狐浏览器v67.0.1 上测试过了。

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


0

在Google Chrome中禁用缓存

您注意到了。以下讨论中有关于标志--disable-application-cache的几次讨论:

这两个选项似乎都受到某些其他依赖项的阻止。


手动访问禁用缓存

禁用缓存选项可以从中的网络选项卡中访问。

Disable cache

打开 DevTools 的键盘快捷键

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

Keyboard shortcuts for opening DevTools

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

通过Selenium支持ChromeDevtoolsProtocol

随着的推出,通过DevTools接口现在可以支持ChromeDevtoolsProtocol(CDP)

  • v4.0.0.0-alpha-1: 通过“DevTools”接口,基本支持CDP。
  • v4.0.0.0-alpha-2: 为CDP添加了额外的领域:网络、性能、安全和目标。
  • v4.0.0-alpha-3: 添加应用程序缓存、获取、网络、性能、分析器、资源计时、安全和目标CDP领域。
  • v4.0.0-alpha-4: Chrome调试协议命令现在镜像最新的CDP规范。
  • v4.0.0-alpha-6: 能够通过完全分布式的网格代理CDP命令。连接的端点通过“se:选项 -> cdp”报告。

Network.setCacheDisabled

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

  • Usage:

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

演示

这里是关于 setCacheDisabled(true) 使用的演示:

环境细节:

  • Selenium v4.0.0-alpha-6
  • ChromeDriver 83.0.4103.39 (2020-05-05)
  • Google Chrome 版本 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 表明缓存已被禁用

-3
我曾经遇到过类似的问题,在导航到需要检查性能的页面之前使用了driver.manage().deleteAllCookies();。这样,每次加载页面时我们都会得到浏览器的新实例。
这种方法适用于Firefox和Chrome驱动程序,没有任何问题。
希望对你有所帮助。

缓存可以包括不仅仅是cookie。这并没有回答问题,而且是一个糟糕的解决方法。 - TheChetan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接