Исключение тайм-аута при использовании инструментов разработчика с selenium-java-4.0.0 и chromedriver v85

Я пытаюсь использовать Java API инструментов selenium dev, и для нескольких методов 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 ответа

Попробуйте позвонить 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()); тогда вы получите другой результат:

Используя Selenium 4.0.0-alpha-6, Chrome v85 и ChromeDriver 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.

Outro

Отключить кеш в 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();
  }
Другие вопросы по тегам