从渲染器接收消息超时:0.100 条日志消息使用 ChromeDriver 和 Chrome v80 通过 Selenium Java

Timed out receiving message from renderer: 0.100 log messages using ChromeDriver and Chrome v80 through Selenium Java

我们最近使用 ChromeDriver v80.0.3987.16 和 Chrome v80.0.3987.87(官方构建)(64 位)升级了我们的测试环境,升级后甚至是最小的程序正在生成大量这些 SEVERE 日志:

[1581082019.282][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.245][SEVERE]: Timed out receiving message from renderer: 0.100

之前偶尔会观察到这些消息,直到使用 Chrome驱动程序 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 有什么变化吗?有什么线索吗?

临时解决方案

以下是针对 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 可以解决问题。

  • 如果您使用来自 Dev or Canary 频道的 Chrome,您需要获取平台特定的二进制文件:

永久解决方案

但是,@bugdroid 通过这个 revision / commit 提交了实际修复,如下所示:

[ChromeDriver] suppress logging of retry loop timeout: r1924789 added a retry loop while waiting for DevTools messages. This spammed users' logs with uninformative timeout reports. This CL suppresses those log messages and correctly reports the command timeout value when appropriate.

:

  • Status: Fixed
  • Labels: ToBeReleased ChromeDriver-82

历史

这个错误信息...

[1581082020.245][SEVERE]: Timed out receiving message from renderer: 0.100

...不一定表示失败。

正如@Tricia mentions 那样,Chrome驱动程序版本 80 修改了等待循环以允许更多重试;此循环将生成该消息,但它会继续收听。然而,该消息的 SEVERE 标签具有误导性。

此外,在讨论中 Issue 3332: Retry timeout logged as severe, @triciac [ChromeDriver Committer] 还补充说,ChromeDriver team 添加了一个小超时(100 ms)到 DevToolsClientImpl::HandleEventsUntil 到启用对导航状态的额外检查。但是,不幸的是,当超时到期时,它被记录为 SEVEREProcessNextMessage)。在这个小超时的情况下,它不应记录为 SEVERE,尽管来自 SendCommandInternal 的超时仍然应该。

所以 Chrome驱动程序需要一种方法来更好地控制日志记录,可能是通过增加超时。但是,如果命令最终超时,列出的timeout持续时间非常小,则需要列出用户定义的超时时间。


立即解决

作为临时解决方案,您可以降级到 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;博士

您可以在以下位置找到一些相关讨论:

根本原因: 每当您在 selenium 驱动程序的帮助下加载某些页面时,driver 脚本会等待页面完全加载。但有时 webdriver 需要更多时间来加载页面,在这种情况下,您会在控制台中看到 TimeoutException 异常。

解决方法:当页面加载时间过长,需要停止下载额外的子资源(图片,CSS,js等) 您可以通过网络驱动程序更改 pageLoadStrategy。

下面的代码只是从页面加载 html 内容。您可以从 chromeoptions

设置页面加载策略
ChromeOptions options = new ChromeOptions();
options.setPageLoadStrategy(PageLoadStrategy.NONE);

更新解决方案-2: 我同意 DebanjanB,None 的 PageLoad 策略,无需下载其他文件(图像、CSS、js 等) 在执行测试时不是一个好主意。我确实搜索了有关它的所有问题并尝试找到有效的解决方案。我尝试了以下选项,因为有时它能够解决这个问题。

    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 其中有帮助但我再次使用页面加载策略找到了一个解决方案。这次我们正在下载所有子资源,但我们正在等待 DOMContentLoaded 事件。此策略称为 Eager。可用的所有 3 种页面加载策略的小定义

1.正常: 此策略导致 Selenium 等待整个页面加载(HTML 内容和子资源已下载并解析)。

2。渴望: 此策略导致 Selenium 等待 DOMContentLoaded 事件(HTML 仅下载和解析内容)。

3。 none : 此策略导致 Selenium 在初始页面内容之后立即 return 已完全收到(HTML 内容已下载)。

注意:默认情况下,当 Selenium 加载页面时,它遵循正常的 pageLoadStrategy。

不使用页面加载策略的代码片段(或默认情况下由 selenium 使用的 Normal)

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

控制台输出:

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 策略 - Eager :

代码段:

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

控制台输出:

Starting ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs/branch-heads/3987@{#185}) on port 1175 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:29:05 AM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Detected dialect: W3C
21

我曾经遇到过与硒结合的C#项目中使用的版本81.0.4044.13800中的chrome驱动程序的相同问题。更新到较新版本的驱动程序对我以及进一步的启动参数都不起作用。

但由于这是一个日志记录问题,这里是最终的解决方案,如所述here:

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

使用这行代码保留代码第一条语句

System.setProperty(ChromeDriverService.CHROME_DRIVER_SILENT_OUTPUT_PROPERTY, "true");

如果你不选择 Leanthy

System.setProperty("webdriver.chrome.silentOutput", "true");