9

我正在尝试使用 selenium 开发工具 java API,并且对于我得到的多种 API 方法java.util.concurrent.TimeoutException

例如我正在尝试使用Network.clearBrowserCache,它应该可以根据 chromedriver 文档工作:https ://chromedevtools.github.io/devtools-protocol/tot/Network/

我正在clearBrowserCache使用以下代码调用: chromeDriver.getDevTools().send(Network.clearBrowserCache())

它失败了,但同时如果我使用这样的其他 devTools 命令: chromeDriver.getDevTools().send(Browser.getVersion())

它正确地返回数据。

  • Chrome 版本为:85.0.4183.39
  • Chromedriver 版本为:85.0.4183.87
  • Selenium-java 版本为:4.0.0-alpha-6
4

3 回答 3

6

createSession在调用之前尝试调用clearBrowserCache

使用您的设置,这有效:

chromeDriver.getDevTools().createSession();
chromeDriver.getDevTools().send(Network.clearBrowserCache())

这会产生java.util.concurrent.TimeoutException

chromeDriver.getDevTools().send(Network.clearBrowserCache())

您可以使用以下代码段验证浏览器缓存是否已清除:

    ChromeDriver driver = new ChromeDriver();
    driver.get("https://refreshyourcache.com/en/cache-test/");
    Thread.sleep(2000);
    driver.getDevTools().createSession();
    driver.getDevTools().send(Network.clearBrowserCache());
    driver.get("https://refreshyourcache.com/en/cache-test/");
    Thread.sleep(5000);

如果您运行代码,测试浏览器中显示的页面将显示以下图像: 在此处输入图像描述

如果您注释掉该行,driver.getDevTools().send(Network.clearBrowserCache());那么您会得到不同的结果: 在此处输入图像描述

于 2020-09-13T08:09:56.650 回答
3

通过使用Selenium 4.0.0-alpha-6Chrome v85ChromeDriver v85.0 ,您必须能够使用以下方法:getVersion()

import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.browser.Browser;

public class BrowserGetVersion {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver","C:\\WebDrivers\\chromedriver.exe");
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--start-maximized");
        ChromeDriver driver = new ChromeDriver(options);
        DevTools devTools = driver.getDevTools();
        devTools.createSession();
        devTools.send(Browser.getVersion());
    }
}

同样,使用该clearBrowserCache()方法,您应该能够使用以下代码块清除浏览器缓存:

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;

public class ClearChromeCache {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver","C:\\WebDrivers\\chromedriver.exe");
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--start-maximized");
        ChromeDriver driver = new ChromeDriver(options);
        DevTools devTools = driver.getDevTools();
        devTools.createSession();
        devTools.send(Network.clearBrowserCache());
        driver.get("https://www.google.com/");
    }
}

额外考虑

此外,您还可以使用以下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.clearBrowserCache());
        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/");

  }
}

这个用例

可能您的代码与错误无关,java.util.concurrent.TimeoutException真正的问题在于:

  • jdk版本
  • 番石榴

解决方案

确保这件事:

  • JDK升级到当前级别JDK 8u252
  • 番石榴升级到guava-29.0-jre

奥特罗

在 Selenium Chrome 驱动程序中禁用缓存

于 2020-09-12T23:48:30.760 回答
2

它工作得很好

public void testCdt {
    final ChromeLauncher launcher = new ChromeLauncher();
    final ChromeService chromeService = launcher.launch(false);
    final ChromeTab tab = chromeService.createTab();
    final ChromeDevToolsService devToolsService = chromeService.createDevToolsService(tab);
    final Page page = devToolsService.getPage();
    Network network = devToolsService.getNetwork();
    // Clear browser cached
    network.clearBrowserCache();
    // Log requests with onRequestWillBeSent event handler.
    network.onRequestWillBeSent(
            event ->
                    System.out.printf(
                            "request: %s %s%s",
                            event.getRequest().getMethod(),
                            event.getRequest().getUrl(),
                            System.lineSeparator()));

    network.onLoadingFinished(
            event -> {
              chromeService.closeTab(tab);
              launcher.close();
            });
    network.enable();
    page.navigate("http://github.com");
    devToolsService.waitUntilClosed();
  }
于 2020-09-12T21:59:03.803 回答