将开发工具与selenium-java-4.0.0和chromedriver v85一起使用时发生超时异常

问题描述

我正在尝试使用Selenium开发工具Java API,对于多种API方法,我正在使用java.util.concurrent.TimeoutException

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

我正在使用以下代码致电clearbrowserCachechromeDriver.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

解决方法

在致电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);

如果运行代码,则测试浏览器中显示的页面将显示以下图像: enter image description here

如果您对driver.getDevTools().send(Network.clearBrowserCache());行表示赞赏,则会得到不同的结果: enter image description here

,

通过使用 Selenium 4.0.0-alpha-6 Chrome v85 ChromeDriver 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

Outro

Disable cache in Selenium Chrome Driver

,

效果很好

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();
  }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...