我正在使用 Selenium ChromeDriver 来测量网页的性能。但默认情况下,Chrome 驱动程序缓存是启用的。
选项--disable-application-cache
现已弃用https://code.google.com/p/chromium/issues/detail?id=447206
我也可以每次都初始化一个新的驱动程序实例,但这不是很方便。
我的问题是有办法正确禁用缓存吗?
谢谢!
我正在使用 Selenium ChromeDriver 来测量网页的性能。但默认情况下,Chrome 驱动程序缓存是启用的。
选项--disable-application-cache
现已弃用https://code.google.com/p/chromium/issues/detail?id=447206
我也可以每次都初始化一个新的驱动程序实例,但这不是很方便。
我的问题是有办法正确禁用缓存吗?
谢谢!
在 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>
正如您所提到的,该选项--disable-application-cache
现在已弃用。
您可以使用--disk-cache-size
并将其设置为zero
. 这将强制磁盘缓存使用的最大磁盘空间为零。尽管它可能不适用于某些较旧的浏览器。我成功测试了它的 firefox v67.0.1
有关更多详细信息,请参阅此命令列表:https ://peter.sh/experiments/chromium-command-line-switches/
你没记错。在以下讨论中,已经对标志进行了多次--disable-application-cache
讨论:
这两个项目似乎都被某些其他依赖项阻止了。
Disable cache
可以Disable cache
从google-chrome-devtools中的Network选项卡访问google -chrome 的选项。
您可以手动使用以下任一键盘快捷键打开 DevTools:
随着selenium4的可用性,现在可以通过界面获得对ChromeDevtoolsProtocol(CDP)的支持。DevTools
Network.setCacheDisabled可用于切换忽略每个请求的缓存。如果true
,则不会使用缓存。
用法:
devTools.send(Network.setCacheDisabled(true));
下面是一个使用的演示setCacheDisabled(true)
:
环境细节:
代码块:
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
确定缓存被禁用
driver.manage().deleteAllCookies();
在导航到需要检查其性能的页面之前,我遇到了类似的情况。这样我们每次加载页面时都会获得一个新的浏览器实例。这适用于 Firefox 和 Chrome 驱动程序,没有任何问题。
希望能帮助到你。