在Selenium Chrome Driver中停用缓存

时间:2015-05-01 13:56:50

标签: java google-chrome selenium selenium-webdriver

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

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

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

我的问题是有没有正确禁用缓存的方法?

谢谢!

4 个答案:

答案 0 :(得分:5)

在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

对于所有示例测试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>

答案 1 :(得分:3)

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

您可以使用--disk-cache-size并将其设置为zero。这将强制磁盘缓存使用的最大磁盘空间为零。尽管在某些较旧的浏览器上可能无法运行。我已经成功地为firefox v67.0.1进行了测试

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

答案 2 :(得分:0)

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

希望它有所帮助。

答案 3 :(得分:0)

在Google Chrome中禁用缓存

您说的没错。在以下讨论中,对标志 --disable-application-cache 进行了多次讨论:

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


手动访问Disable cache

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

Disable cache

用于打开DevTools的键盘快捷键

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

Keyboard shortcuts for opening DevTools

您可以在Opening inspect (pressing F12) on Chrome via Selenium

中找到相关的讨论

通过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 :添加ApplicationCache,提取,网络,性能,事件探查器,ResourceTiming,安全性和目标CDP域。
  • v4.0.0-alpha-4 :Chrome调试协议命令现在可以反映最新的CDP规范。
  • v4.0.0-alpha-6 :能够从本地通过完全分布式的Grid代理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)
  • 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 可以确定缓存已禁用