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

Deb*_*anB 49 selenium google-chrome renderer chromium selenium-chromedriver

我们最近使用 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
Run Code Online (Sandbox Code Playgroud)

早些时候,在使用 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

控制台输出:

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
Run Code Online (Sandbox Code Playgroud)

有人面临同样的情况吗?ChromeDriver/Chrome v80 相对于 ChromeDriver/Chrome v79 是否有任何变化?有什么线索吗?

Deb*_*anB 26

临时解决方案

以下是针对不同Chrome用户的解决方案。

  • 如果您使用的是Chrome v80,则使用最近发布的ChromeDriver 80.0.3987.106可以解决该问题。

    • 代码块:

      System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
      WebDriver driver =  new ChromeDriver();
      driver.quit();
      
      Run Code Online (Sandbox Code Playgroud)
    • 控制台输出:

      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
      
      Run Code Online (Sandbox Code Playgroud)
  • 如果您使用的是Chrome v81,则使用最近发布的ChromeDriver 81.0.4044.20可以解决该问题。

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

永久解决方案

但是,@bugdroid通过此修订/提交提交了实际修复,如下所示:

[ChromeDriver] 禁止记录重试循环超时r1924789在等待 DevTools 消息时添加了重试循环。这用无信息的超时报告向用户的日志发送垃圾邮件。此 CL 会抑制这些日志消息,并在适当时正确报告命令超时值。

注意

  • 状态:固定
  • 标签:待发布 ChromeDriver-82

历史

这个错误信息...

[1581082020.245][SEVERE]: Timed out receiving message from renderer: 0.100
Run Code Online (Sandbox Code Playgroud)

...并不一定表示失败。

正如@Tricia提到的那样,ChromeDriver 版本 80 修改了一个等待循环以允许更多的重试;此循环将生成该消息,但它会继续侦听。但是,该消息的SEVERE标记具有误导性。

此外,在讨论问题 3332:重试超时记录为严重时@triciac [ChromeDriver Committer] 还补充说,ChromeDriver 团队添加了一个小超时(100 毫秒)DevToolsClientImpl::HandleEventsUntil以启用对导航状态的额外检查。但是,不幸的是,当此超时到期时,它被记录为SEVERE (by ProcessNextMessage)。在这种小超时的情况下,它不应该记录为SEVERE,尽管SendCommandInternal仍然应该超时。

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


立即解决

作为临时解决方案,您可以降级到ChromeDriver v79.0.3945.36,因为控制台中似乎没有显示SEVERE日志,但您会看到警告

[WARNING]: This version of ChromeDriver has not been tested with Chrome version 80
Run Code Online (Sandbox Code Playgroud)

这听起来像是一个......安全的解决方法......并且已经由Chromium团队成员确认。

chromedriver79

  • 代码块:

    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();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 控制台输出:

    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
    
    Run Code Online (Sandbox Code Playgroud)

tl; 博士

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

  • 回复:Chrome v80,使用最近发布的 ChromeDriver 80.0.3987.106 解决了该问题。回复:Chrome v81,使用最近发布的 ChromeDriver 81.0.4044.20 解决了该问题。我仍然发现 ChromeDirver 更新存在问题。 (4认同)

Muz*_*mil 14

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

解决方案:当页面加载时间过长,需要停止下载额外的子资源(图片、CSS、js 等)时,可以通过 webdriver 更改 pageLoadStrategy。

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

ChromeOptions options = new ChromeOptions();
options.setPageLoadStrategy(PageLoadStrategy.NONE);
Run Code Online (Sandbox Code Playgroud)

更新的解决方案 -2:我同意 DebanjanB,PageLoad 策略为 None,在执行测试时不下载附加文件(图像、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");
Run Code Online (Sandbox Code Playgroud)

他们都没有帮助但我再次找到了一个使用页面加载策略的解决方案。这次我们正在下载所有子资源,但我们正在等待DOMContentLoaded事件。这种策略称为Eager。可用的所有 3 种页面加载策略的小定义

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

2.eager: 这个策略导致Selenium等待DOMContentLoaded事件(只下载和解析HTML内容)。

3. none : 此策略使Selenium 在初始页面内容完全接收(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();
Run Code Online (Sandbox Code Playgroud)

控制台输出:

在端口 41540 上启动 ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs/branch-heads/3987@{#185}) 仅允许本地连接。请保护 ChromeDriver 和相关测试框架使用的端口,防止恶意代码访问。2020 年 2 月 11 日上午 10:22:12 org.openqa.selenium.remote.ProtocolHandshake createSession INFO:检测到方言:W3C [1581412933.937][SEVERE]:从渲染器接收消息超时:0.104016E.SEVER.SEVER.从渲染器接收消息:0.100 [1581412934.168][SEVERE]:从渲染器接收消息超时:0.100 [1581412934.360][SEVERE]:从渲染器接收消息超时:0.100 [158141612134] 从渲染器接收消息超时:0.100 0.100 [1581412934.618][严重]:从渲染器接收消息超时:0.100 [1581412934.719][严重]:

使用 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();
Run Code Online (Sandbox Code Playgroud)

控制台输出:

在端口 1175 上启动 ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs/branch-heads/3987@{#185}) 仅允许本地连接。请保护 ChromeDriver 和相关测试框架使用的端口,防止恶意代码访问。2020 年 2 月 11 日上午 10:29:05 org.openqa.selenium.remote.ProtocolHandshake createSession 信息:检测到的方言:W3C
21

  • @DebanjanB 我同意你的观点,但正如你所知,社区也是要解决问题的。我尝试了所有可用的最佳解决方案。如果您知道 Chrome 驱动程序中存在 **ISSUE** 或 **BUG**,那么我们必须将此问题记录到他们的 Git 项目或推荐位置。在 SO 中提出问题不会有帮助。 (3认同)