Истекло время получения сообщения от средства визуализации: 0,100 сообщений журнала с использованием ChromeDriver и Chrome v80 через Selenium Java
Недавно мы обновили нашу тестовую среду с помощью ChromeDriver v80.0.3987.16 и Chrome v80.0.3987.87 (официальная сборка) (64-разрядная версия), и после обновления даже минимальная программа создает много этих СЕРЬЕЗНЫХ журналов:
[1581082019.282][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.245][SEVERE]: Timed out receiving message from renderer: 0.100
Раньше эти сообщения время от времени наблюдались вплоть до комбинации ChromeDriver v79.0 / Chrome v79.0.
Минимальный блок кода:
public class chromeDemo
{
public static void main(String[] args)
{
System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("https://www.google.com/");
driver.quit();
}
}
Консольный вывод:
Starting ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs/branch-heads/3987@{#185}) on port 9194
Only local connections are allowed.
Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
Feb 07, 2020 6:56:57 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C
[1581082019.282][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.245][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.430][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.531][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.632][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.734][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.835][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082021.364][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082021.544][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082021.647][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082021.748][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082021.850][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082021.952][SEVERE]: Timed out receiving message from renderer: 0.100
Кто-нибудь сталкивается с таким же? Были ли какие-либо изменения в ChromeDriver/Chrome v80 по сравнению с ChromeDriver/Chrome v79? Какие-нибудь подсказки?
5 ответов
Промежуточное решение
Вот решения для разных вариантов пользователей Chrome.
Если вы используете Chrome v80, использование недавно выпущенного ChromeDriver 80.0.3987.106 решает проблему.
Блок кода:
System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.quit();
Консольный вывод:
Starting ChromeDriver 80.0.3987.106 (f68069574609230cf9b635cd784cfb1bf81bb53a-refs/branch-heads/3987@{#882}) on port 20041 Only local connections are allowed. Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code. Feb 14, 2020 9:50:57 PM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Detected dialect: W3C
Если вы используете Chrome v81, использование недавно выпущенного ChromeDriver 81.0.4044.20 решает проблему.
- Если вы используете Chrome из канала Dev или Canary, вам необходимо выбрать двоичные файлы для конкретной платформы:
Постоянное решение
Однако, @bugdroid
представил фактическое исправление посредством этой ревизии / фиксации, которое выглядит следующим образом:
[ChromeDriver] подавляет регистрацию тайм-аута цикла повтора: r1924789 добавил цикл повтора во время ожидания сообщений DevTools. Это засыпало журналы пользователей неинформативными отчетами о тайм-аутах. Этот CL подавляет эти сообщения журнала и правильно сообщает значение времени ожидания команды, когда это необходимо.
Примечание:
- Статус: Исправлено
- Ярлыки: ToBeReleased ChromeDriver-82
История
Это сообщение об ошибке...
[1581082020.245][SEVERE]: Timed out receiving message from renderer: 0.100
... не обязательно указывает на сбой.
Как упоминает @Tricia, ChromeDriver версии 80 изменил цикл ожидания, чтобы разрешить больше попыток; этот цикл сгенерирует это сообщение, но продолжает прослушивание. Однако тег SEVERE для этого сообщения вводит в заблуждение.
Кроме того, в обсуждении " Проблема 3332: время ожидания повторной попытки, зарегистрированное как серьезное", @triciac [ChromeDriver Committer] также добавил, что команда ChromeDriver добавила небольшой тайм-аут (100 мс) дляDevToolsClientImpl::HandleEventsUntil
для включения дополнительной проверки статуса навигации. Но, к сожалению, когда этот таймаут истек, он регистрируется как СЕРЬЕЗНЫЙ (byProcessNextMessage
). В случае этого небольшого тайм-аута он не должен регистрироваться как СЕРЬЕЗНЫЙ, хотя таймауты отSendCommandInternal
все еще должен.
Итак, ChromeDriver нужен способ лучше контролировать ведение журнала, возможно, за счет увеличения тайм-аута. Однако, если время ожидания команды окончательно истекло, а указанная длительность тайм-аута очень мала, то вместо этого необходимо указать время ожидания, определяемое пользователем.
Немедленное решение
В качестве временного решения вы можете перейти на ChromeDriver v79.0.3945.36, поскольку кажется, что журналы SEVERE не отображаются в консоли, но вы увидите ПРЕДУПРЕЖДЕНИЕ:
[WARNING]: This version of ChromeDriver has not been tested with Chrome version 80
что звучит как ... безопасный обходной путь... и был подтвержден членом команды Chromium.
Блок кода:
public class A_Chrome { public static void main(String[] args) { System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.get("https://www.google.com/"); driver.quit(); } }
Консольный вывод:
Starting ChromeDriver 79.0.3945.36 (3582db32b33893869b8c1339e8f4d9ed1816f143-refs/branch-heads/3945@{#614}) on port 9200 Only local connections are allowed. Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code. [1581503845.444][WARNING]: This version of ChromeDriver has not been tested with Chrome version 80. Feb 12, 2020 4:07:26 PM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Detected dialect: W3C
tl; доктор
Вы можете найти пару соответствующих обсуждений в:
Root cause: Whenever you are loading some page with the help of selenium driver, then driver
script wait till page is completely loaded. But sometime webdriver takes more time to load page, in that case you will see TimeoutException
exception in your console.
Solution: When Page Loading takes too much time and you need to stop downloading additional subresources (images, css, js etc) you can change the pageLoadStrategy through the webdriver.
Below code just load the html content from page. You can set page load strategy from chromeoptions
ChromeOptions options = new ChromeOptions();
options.setPageLoadStrategy(PageLoadStrategy.NONE);
Updated Solution -2: I am agree with DebanjanB, PageLoad strategy with None, without download additional files (images, css, js etc) is not good idea while performing testing. I did search all issue about it and try to find a valid solution. I tried below options as sometime at somepoint it was able to resolve this issue.
options.addArguments("start-maximized");
options.addArguments("enable-automation");
options.addArguments("--no-sandbox");
options.addArguments("--disable-infobars");
options.addArguments("--disable-dev-shm-usage");
options.addArguments("--disable-browser-side-navigation");
options.addArguments("--disable-gpu");
None of them helped But I found one solution again with Page load strategy. This time we are downloading all subresources but we are wait for the DOMContentLoaded event. This strategy called Eager. A small definition of available all 3 pageload strategies
1. normal:This strategy causes Selenium to wait for the full page loading (html content and sub resources downloaded and parsed).
2. eager:This strategy causes Selenium to wait for the DOMContentLoaded event (html content downloaded and parsed only).
3. none: This strategy causes Selenium to return immediately after the initial page content is fully received (html content downloaded).
NOTE: By default, when Selenium loads a page, it follows the normal pageLoadStrategy.
Code snippet without using Pageload strategy (Or Normal as used by selenium by default)
System.setProperty("webdriver.chrome.driver", "C:\\Users\\...\\LatestDriver\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.get("http://www.google.com");
driver.manage().window().maximize();
WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement el = wait.until(ExpectedConditions.elementToBeClickable(By.name("q")));
el.click();
List <WebElement> allLinks = driver.findElements(By.tagName("a"));
System.out.println(allLinks.size());
driver.quit();
Console Output:
Starting ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs/branch-heads/3987@{#185}) on port 41540 Only local connections are allowed. Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code. Feb 11, 2020 10:22:12 AM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Detected dialect: W3C [1581412933.937][SEVERE]: Timed out receiving message from renderer: 0.100 [1581412934.066][SEVERE]: Timed out receiving message from renderer: 0.100 [1581412934.168][SEVERE]: Timed out receiving message from renderer: 0.100 [1581412934.360][SEVERE]: Timed out receiving message from renderer: 0.100 [1581412934.461][SEVERE]: Timed out receiving message from renderer: 0.100 [1581412934.618][SEVERE]: Timed out receiving message from renderer: 0.100 [1581412934.719][SEVERE]: Timed out receiving message from renderer: 0.100 [1581412934.820][SEVERE]: Timed out receiving message from renderer: 0.100 [1581412934.922][SEVERE]: Timed out receiving message from renderer: 0.100 [1581412935.097][SEVERE]: Timed out receiving message from renderer: 0.100 21
Со стратегией PageLoad - нетерпеливо:
Фрагмент кода:
System.setProperty("webdriver.chrome.driver", "C:\\Users\\...\\LatestDriver\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.setPageLoadStrategy(PageLoadStrategy.EAGER);
WebDriver driver=new ChromeDriver(options);
driver.get("http://www.google.com");
driver.manage().window().maximize();
WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement el = wait.until(ExpectedConditions.elementToBeClickable(By.name("q")));
el.click();
List <WebElement> allLinks = driver.findElements(By.tagName("a"));
System.out.println(allLinks.size());
driver.quit();
Консольный вывод:
Запуск ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs/branch-heads/3987@{#185}) на порту 1175 Разрешены только локальные подключения. Защитите порты, используемые ChromeDriver и соответствующими тестовыми платформами, чтобы предотвратить доступ вредоносного кода. 11 февраля 2020 г. 10:29:05 org.openqa.selenium.remote.ProtocolHandshake createSession ИНФОРМАЦИЯ: Обнаруженный диалект: W3C
21
Используйте эту строку кода, сохраните первую инструкцию кода
System.setProperty(ChromeDriverService.CHROME_DRIVER_SILENT_OUTPUT_PROPERTY, "true");
Если вы не идете на Leanthy
System.setProperty("webdriver.chrome.silentOutput", "true");
теперь я использую Chrome v81.0.4044.92, эта проблема все еще существует. В нормальных условиях, если элемент не найден, будет выдано исключение, но когда эта проблема возникнет, он будет ждать вечно
Раньше у меня была такая же проблема с драйвером Chrome в версии 81.0.4044.13800, который использовался в проекте C# в сочетании с селеном. Обновления до более новой версии драйвера у меня не работали, как и другие аргументы при запуске.
Но поскольку это проблема с логированием, вот окончательное решение, которое работает для меня, как описано здесь:
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.AddArguments(new List<string>()
{
"no-sandbox",
"headless",
"disable-gpu"
});
ChromeDriverService service = ChromeDriverService.CreateDefaultService();
service.SuppressInitialDiagnosticInformation = true;
var driver = new ChromeDriver(service, chromeOptions);