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

48

我们最近升级了测试环境,使用了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

在使用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 v79,ChromeDriver/Chrome v80 有任何变化吗?有什么线索吗?


7
我也面临着同样的问题 :( - Sooraj
9
我们升级到v80后遇到了相同的问题。不过你的问题可能应该询问如何解决它,而不是询问是否有其他人遇到了相同的问题。 - Taplar
4
我无法相信这个问题已经被关闭了。许多时候,SO都无法成为有帮助的引擎。 - Saeed Neamati
4
面对完全相同的问题。我们所有自动化的Selenium代码都无法正常运行。而且因为很多复杂性问题,我们无法降级处理。 - Saeed Neamati
2
仍然无法使用ChromeDriver + Chrome 81。而且解决方法也不起作用,因为ChromeDriver 79与Chrome 81不兼容。 - whydoieven
显示剩余9条评论
4个回答

25

临时解决方案

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

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或Canary频道的Chrome,则需要获取特定于平台的二进制文件:

  • 永久解决方案

    然而,@bugdroid通过这个修订版/提交提交了实际的修复方法,具体如下:

    [ChromeDriver]抑制重试循环超时日志记录r1924789添加了在等待DevTools消息时的重试循环。这会使用户的日志充满无效的超时报告。此CL抑制这些日志消息,并在适当时正确报告命令超时值。

    注意

    • 状态:已修复
    • 标签:ToBeReleased ChromeDriver-82

    历史记录

    此错误消息...

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

    “不一定表示失败。”

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

    此外,在讨论中,问题3332:Retry timeout logged as severe@triciac [ChromeDriver Committer]还添加说,ChromeDriver团队向DevToolsClientImpl::HandleEventsUntil添加了一个小的超时(100毫秒)以启用对导航状态的附加检查。但是,不幸的是,当此超时到期时,它被记录为SEVERE(由ProcessNextMessage)。在这种小超时的情况下,它不应记录为SEVERE,尽管来自SendCommandInternal的超时仍应该。

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


    即时解决方案

    作为过渡性解决方案,您可以降级到ChromeDriver v79.0.3945.36,因为似乎控制台中不会显示SEVERE日志,但是你会看到WARNING警告:

    [WARNING]: This version of ChromeDriver has not been tested with Chrome version 80
    

    听起来像是一个安全的解决方案,并且已经得到了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();
          }
      }
      
    • 控制台输出:

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

    以下是几个相关讨论:


    1
    还要注意,这条日志消息似乎被写入到stderror中。我运行了使用vstest.console.exe测试后,一个PowerShell脚本开始失败,因为即使测试已通过,PowerShell $?变量也是$false。PowerShell似乎认为任何写入到stderror的内容都是失败的,尽管测试运行器的$LastExitCode返回了零。 - Greg Burghardt
    4
    回复:Chrome浏览器版本80,使用最近发布的ChromeDriver 80.0.3987.106可以解决问题。 回复:Chrome浏览器版本81,使用最近发布的ChromeDriver 81.0.4044.20可以解决问题。 我仍然在使用ChromeDriver更新后看到这个问题。 - Neil
    1
    是的!!!ChromeDriver v79 win32与chrome v80.0.3987.132完美兼容,控制台不会出现超时错误。但有时Chromedriver无法启动服务器。 - Surodip
    1
    使用 chromedriver v79 的解决方法已经无法在最新的稳定版 chrome(81.0.4044.92)上运行,驱动程序甚至不能打开 chrome。我升级了到最新的chromedriver,并且它可以工作,但是严重超时错误再次出现。 - PST
    @PST - 完全相同的问题。这真让人沮丧。 - whydoieven
    我尝试下载 Mac 版本的 81.0.4044.20 和 81.0.4044.69 来解决这个问题,但都未能解决。我是否漏掉了什么? - Doug Noel

    16

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

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

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

    ChromeOptions options = new ChromeOptions();
    options.setPageLoadStrategy(PageLoadStrategy.NONE);
    

    更新解决方案-2:我同意DebanjanB的观点,在测试过程中,使用无页面加载策略(PageLoad strategy)且不下载其他文件(如图像、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");
    

    没有一个方案能够帮助我,但我再次通过页面加载策略找到了一个解决方案。这一次,我们下载了所有的子资源,但是我们等待DOMContentLoaded事件。这个策略被称为Eager。以下是三种可用的页面加载策略的简要定义:

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

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

    3. none: 这种策略会导致Selenium在接收到初始页面内容后立即返回(HTML内容已下载)。

    注意:默认情况下,当Selenium加载页面时,它遵循normal页面加载策略。

    不使用页面加载策略的代码段(或默认情况下由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();
    

    控制台输出:

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

    使用页面加载策略-急切:

    代码片段:

    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和相关测试框架使用的端口,以防止恶意代码访问。2020年2月11日上午10:29:05,org.openqa.selenium.remote.ProtocolHandshake createSession INFO:检测到方言:W3C
    21


    通常情况下,您无法调整PageLoad策略,因为WebDriver配置是标准化的,并且最适合所需的测试策略。但是,在如何使Selenium不等待完整页面加载不要等待页面加载的讨论中,我们详细讨论了这个问题。这是ChromeDriver v80的一个问题。 - undetected Selenium
    3
    我同意你的观点,但是你知道SO是一个关于解决问题的社区。我已经尝试了所有可能的最佳解决方案。如果你认为这是Chrome驱动程序中的问题或者错误,那么我们需要在它们的Git项目或者推荐的地方记录这个问题。在SO上提出问题是没有帮助的。 - Muzzamil
    我最近更新了我的Chrome和Chromedriver,然后开始收到所有这些警告消息。现在我正在尝试降级我的Chrome,但找不到下载Chrome 79v的链接。有人可以提供给我下载Chrome 79v的链接吗? - Vin
    @Vin 在这里你可以下载 https://chromedriver.chromium.org/downloads - Muzzamil

    0
    使用这行代码保持代码的第一个语句
    System.setProperty(ChromeDriverService.CHROME_DRIVER_SILENT_OUTPUT_PROPERTY, "true");
    

    如果你不选择Leanthy

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

    -3

    我曾经在使用C#项目结合Selenium时,遇到了Chrome驱动程序版本81.0.4044.13800的同样问题。更新到新版本的驱动程序以及进一步的启动参数都没有解决我的问题。

    但由于这是一个日志记录问题,这里有一个最终解决方案,对我有效,具体描述请参见此处

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

    这不是一个日志问题。 - misantroop

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接