Исключение тайм-аута при использовании инструментов разработчика с 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
Все работало нормально
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();
}