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


38

我们最近通过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 v80相对于ChromeDriver / Chrome v79是否有变化?有什么线索吗?


7
我也面临着同样的问题:(
Sooraj

6
升级到v80后,我遇到了同样的问题。但是,您的问题可能应该询问如何解决,而不是询问其他任何人是否也面临相同的问题。
Taplar

2
我不敢相信这个问题已经解决。SO常常无法作为帮助的引擎。
Saeed Neamati

4
面对完全相同的问题。我们所有的自动Selenium代码均已损坏。而且由于许多复杂因素,我们不能降级。
Saeed Neamati

2
@DebanjanB是的,我浏览了您的帖子。我希望他们可以在下一个版本中对其进行修复。我试图找出解决方案,所以我已经提到过,但是还有更多选项可以防止超时。我将尝试其他选项,但是如果超时时间非常短,那么我认为我们需要等待下一个版本。
Muzzamil

Answers:


24

临时解决方案

以下是针对不同版本的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或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:重试记录为严重”的讨论中,@ triciac [ChromeDriver Committer]还添加了,ChromeDriver团队添加了一个较小的超时(100 ms)DevToolsClientImpl::HandleEventsUntil以启用对导航状态的附加检查。但是,不幸的是,当此超时到期时,它被记录为SEVERE(by ProcessNextMessage)。在这种小的超时情况下,尽管仍然应该超时,但它不应记录为SEVERESendCommandInternal

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


立即解决

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

[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; 博士

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


1
还应注意,此日志消息似乎已写入stderror。使用PowerShell运行测试后,我的PowerShell脚本开始失败,vstest.console.exe因为即使测试通过了,PowerShell $?变量$false仍然存在。PowerShell似乎认为写入stderror的任何操作都是失败的,即使$LastExitCode测试运行程序的返回零。
Greg Burghardt

4
回复:Chrome v80,使用最近发布的ChromeDriver 80.0.3987.106解决了该问题。回复:Chrome v81,使用最近发布的ChromeDriver 81.0.4044.20解决了此问题。我仍然看到ChromeDirver更新的问题。
尼尔

1
是的!! ChromeDriver v79 win32在chrome v80.0.3987.132上正常工作,并且未在控制台中给出TimedOut错误。但是有时Chromedriver无法启动服务器。
Surodip

1
使用chromedriver v79解决方法不再适用于最新版本的稳定chrome(81.0.4044.92),因为驱动程序甚至无法打开chrome。我将chromedriver升级到最新版本,并且可以使用,但是严重的超时错误已返回。
PST

@PST-完全一样的问题。这令人沮丧。
Sriram Ilango

10

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

解决方案:当页面加载花费太多时间,并且您需要停止下载其他子资源(图像,css,js等)时,可以通过Webdriver更改pageLoadStrategy。

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

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

更新的解决方案-2:我同意DebanjanB,无页面加载策略,并且在执行测试时不下载其他文件(图像,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。对所有3种页面加载策略的简要定义

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

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

3. none: 此策略使Selenium在完全接收初始页面内容(下载html内容)后立即返回。

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

不使用Pageload策略的代码段(默认情况下为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();

控制台输出:

在端口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.100 [1581412934.066] [SEVERE]:超时接收来自渲染器的消息:0.100 [1581412934.168] [SEVERE]:超时接收来自渲染器的消息:0.100 [1581412934.360] [SEVERE]:超时接收来自渲染器的消息:0.100 [1581412934.461] [SEVERE]:超时接收来自渲染器的消息: 0.100 [1581412934.618] [严重]:

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

控制台输出:

在端口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 INFO:检测到方言:W3C
21


通常,您将无法调整PageLoad策略,因为WebDriver配置是标准化的并且最适合所需的测试策略。但是,在讨论如何让Selenium不要等到整个页面加载之后不要等待页面加载,我们已经详细讨论了。ChromeDriver v80有问题。
DebanjanB

2
@DebanjanB我同意您的看法,但正如您所知,社区是要解决的问题。我尝试了所有可能的最佳解决方案。如果您知道它是chrome驱动程序中的ISSUEBUG,那么我们必须将此问题记录在其Git项目或推荐的位置。在SO中提出问题将无济于事。
Muzzamil

我最近更新了chrome和chromedriver,然后开始获取所有这些警告消息。现在,我正在尝试将chrome降级,却找不到从何处获得chrome 79v。有人可以给我链接下载chrome 79v
Vin

@Vin在这里,您可以下载chromedriver.chromium.org/downloads
Muzzamil
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.