使用selenium-java-4.0.0和chromedriver v85时,使用开发工具出现超时异常

9

我正在尝试使用selenium dev tools 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
3个回答

6

在调用clearBrowserCache之前,请尝试调用createSession

按照您的设置,以下方法有效:

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());这一行注释掉,则会得到不同的结果: 在此输入图片描述

1
谢谢,它解决了最初的问题 - 'clearBrowserCache' 没有错误返回,但它并没有完成工作 - 我发现缓存没有被清除,可能是另一个无关的问题,不管怎样,也许你有想法如何解决这个问题? - XZen
3
我已添加了一个代码示例,用于验证调用clearBrowserCache()的结果。 - mcernak

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 版本
  • guava 版本

解决方案

确保以下内容:

  • JDK 已升级至当前版本 JDK 8u252
  • guava 已升级至 guava-29.0-jre

结尾

禁用 Selenium Chrome Driver 缓存


1
谢谢你,创建会话在使用命令之前是我所遗漏的要点,但不幸的是当我验证缓存是否真的被清除(通过比较浏览器发送给我的服务器的实际请求数量)时,我发现行为就像我根本没有调用“清除浏览器缓存”一样-请求似乎被缓存了。同时,如果我重新启动驱动程序-我会获得清除会话和缓存的机会,我的测试就可以通过,所以它们是正确的。 - XZen
@XZen 请查看答案更新并告知状态。 - undetected Selenium
1
谢谢,setCacheDisabled按预期工作,但在我的情况下,我需要在某个时刻清除缓存,而不是完全禁用它。 - XZen
@XZen 太好了!!! 很高兴能帮助你!!! setCacheDisabled 是基于请求设置的。在下一行代码或操作中,它将再次被设置为 disabled。让我知道你测试的结果。与此同时,我将尝试提供更符合你用例的东西。 - undetected Selenium

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

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