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

Posted

技术标签:

【中文标题】使用带有 selenium-java-4.0.0 和 chromedriver v85 的开发工具时出现超时异常【英文标题】:Timeout exception when using dev tools with selenium-java-4.0.0 and chromedriver v85 【发布时间】:2020-12-28 23:58:01 【问题描述】:

我正在尝试使用 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 Chrome驱动版本为:85.0.4183.87 Selenium-java 版本为:4.0.0-alpha-6

【问题讨论】:

【参考方案1】:

使用 Selenium 4.0.0-alpha-6Chrome v85ChromeDriver v85.0 到 google-chrome-devtools,您必须能够使用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 升级为 guava-29.0-jre

结尾

Disable cache in Selenium Chrome Driver

【讨论】:

谢谢,在使用命令之前创建会话是我错过的重点,但不幸的是,当我验证缓存是否真的被清除(通过比较浏览器实际发送到我的服务器的请求数)时,我看到了这种行为就像我根本没有调用“清除浏览器缓存”一样——请求似乎被缓存了。同时,如果我重新启动驱动程序-我正在清除会话和缓存并且我的测试通过了,所以它们是正确的 @XZen 查看答案更新并告诉我状态。 谢谢,setCacheDisabled 按预期工作,但在我的情况下,我需要在某个时候清除缓存,而不是完全禁用它 @XZen 好消息!!!很高兴能帮到你!!! setCacheDisabled 根据请求工作。在下一行代码或操作中,它将再次设置为disabled。让我知道你的测试结果。同时,我会尝试推出更适合您的用例的东西。【参考方案2】:

在调用clearBrowserCache之前尝试调用createSession

使用您的设置,这是可行的:

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

这会产生java.util.concurrent.TimeoutException:

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

您可以使用这个 sn-p 验证浏览器缓存是否已清除:

    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()); 行,那么您会得到不同的结果:

【讨论】:

谢谢,它修复了原来的问题 - 'clearBrowserCache' 返回没有错误,但它没有完成工作 - 我看到缓存没有被清除,也许这是另一个不相关的问题,无论如何也许您有解决方法的想法? 我添加了一个代码示例,用于验证调用clearBrowserCache()的结果。【参考方案3】:

效果很好

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-java-4.0.0 和 chromedriver v85 的开发工具时出现超时异常的主要内容,如果未能解决你的问题,请参考以下文章

HBase - 使用带有值列表的一列与使用带有列列表的一列族的优缺点是啥?

如何使用带有或不带有 Appium 的 Robot Framework 集成 WinAppDriver?

使用带有 ajax Rest 调用的 Spring CSRF 和带有 Thymeleaf 的 HTML 页面

如何在带有 React 的 Typescript/JSX 中使用带有箭头函数的泛型?

优化数据库有啥更好的方法:使用带有不同过滤器的一堆存储过程,还是使用带有 if 条件的单个存储过程?

使用带有数据数组的 Yii2 和带有排序和过滤的 Gridview