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

Posted

技术标签:

【中文标题】从渲染器接收消息超时: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 【发布时间】:2020-05-23 15:51:07 【问题描述】:

我们最近使用 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 是否有任何变化?有什么线索吗?

【问题讨论】:

我也面临同样的问题:( 升级到 v80 后,我遇到了同样的问题。不过,您的问题可能应该问如何解决它,而不是问其他人是否面临同样的问题。 我不敢相信这个问题已经结束了。很多时候,SO 无法作为提供帮助的引擎。 面临完全相同的问题。我们所有的自动化 Selenium 代码都被破坏了。而且由于很多复杂性,我们无法降级。 @DebanjanB 是的,我浏览了你的帖子。我希望他们能在下一个版本中修复它。我试图找出解决方案,所以我已经提到了它,但是还有更多选项可以防止超时。我会尝试使用其他选项,但如果超时时间非常短,那么我认为我们需要等待下一个版本。 【参考方案1】:

临时解决方案

以下是针对不同版本的 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,您需要获取平台特定的二进制文件: Linux (64-bit) Mac OS X (64-bit) Windows (32-bit)

永久解决方案

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

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

注意

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

历史

此错误消息...

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

...不一定表示失败。

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

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

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


立即解决

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

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

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

Issue 3333: ChromeDriver may block indefinitely while waiting for pending navigation after net::ERR_CONTENT_DECODING_FAILED Issue 3336: WebDriver 80.0.3987.16 can't open Chrome on Linux

【讨论】:

另请注意,此日志消息似乎已写入 stderror。在使用 vstest.console.exe 运行测试后,我的 PowerShell 脚本开始失败,因为即使测试通过,PowerShell $? 变量也是 $false。 PowerShell 似乎认为写入 stderror 的任何内容都是失败的,即使测试运行程序的 $LastExitCode 返回零。 Re: Chrome v80,使用最近发布的 ChromeDriver 80.0.3987.106 解决了这个问题。回复:Chrome v81,使用最近发布的 ChromeDriver 81.0.4044.20 解决了这个问题。我仍然看到 ChromeDirver 更新的问题。 是的!!!!!ChromeDriver v79 win32 与 chrome v80.0.3987.132 一起工作正常,并且在控制台中没有出现 TimedOut 错误。但有时 Chromedriver 启动服务器失败。 使用 chromedriver v79 解决方法不再适用于最新版本的稳定版 chrome (81.0.4044.92),驱动程序甚至无法打开 chrome。我将 chromedriver 升级到最新版本,它可以工作,但又出现了严重的超时错误。 @PST - 完全相同的问题。这令人沮丧。【参考方案2】:

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

解决方案:当页面加载时间过长而您需要停止下载其他子资源(图片、CSS、js 等)时,您可以通过网络驱动程序。

下面的代码只是从页面加载 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");

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

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

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

3.无: 此策略导致 Selenium 在初始页面内容之后立即返回 已完全接收(已下载 HTML 内容)。

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

代码 sn-p 不使用页面加载策略(或默认情况下由 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 信息:检测到的方言:W3C [1581412933.937][严重]:从渲染器接收消息超时:0.100 [1581412934.066][严重]:从渲染器接收消息超时:0.100 [1581412934.168][严重]:从渲染器接收消息超时:0.100 [1581412934.360][严重]:从渲染器接收消息超时:0.100 [1581412934.461][严重]:从渲染器接收消息超时:0.100 [1581412934.618][严重]:从渲染器接收消息超时:0.100 [1581412934.719][严重]:从渲染器接收消息超时:0.100 [1581412934.820][严重]:从渲染器接收消息超时:0.100 [1581412934.922][严重]:从渲染器接收消息超时:0.100 [1581412935.097][严重]:从渲染器接收消息超时: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 和相关测试框架使用它来防止访问 恶意代码。 2020 年 2 月 11 日 10:29:05 org.openqa.selenium.remote.ProtocolHandshake createSession 信息: 检测到的方言:W3C 21

【讨论】:

通常您无法调整 PageLoad 策略,因为 WebDriver 配置是标准化的并且最适合所需的测试策略。但是,在How to make Selenium not wait till full page load、Don't wait for a page to load 的讨论中,我们已经详细讨论过了。这是 ChromeDriver v80 的问题。 @DebanjanB 我同意你的看法,但正如你所知,社区即将解决问题。我尝试了任何可用的最佳解决方案。如果您知道它是 chrome 驱动程序中的 ISSUEBUG,那么我们必须在他们的 Git 项目或推荐的地方记录这个问题。在 SO 中提出问题无济于事。 我最近更新了我的 chrome 和 chromedriver,然后开始收到所有这些警告消息。现在我正在尝试降级我的 chrome,但找不到 chrome 79v 的位置。谁能给我下载chrome 79v的链接 @Vin 你可以在这里下载chromedriver.chromium.org/downloads【参考方案3】:

使用这行代码保持代码优先声明

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

如果你不喜欢 Leanthy

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

【讨论】:

【参考方案4】:

我曾经在 81.0.4044.13800 版本中与 selenium 结合使用的 C# 项目中的 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);

【讨论】:

这不是日志记录问题。

以上是关于从渲染器接收消息超时:0.100 条日志消息使用 ChromeDriver 和 Chrome v80 通过 Selenium Java的主要内容,如果未能解决你的问题,请参考以下文章

错误 [严重]:从渲染器接收消息超时:20.000 在 Jenkins 上通过 Selenium 执行测试套件时

接收来自渲染器的消息超时:600.000 with Chrome v73.0, ChromeDriver 2.46 on Bamboo Server

Selenium-Chrome-Headless:无法从渲染器接收消息

阻塞非阻塞超时(同步与异步)

Electron - 限制从主进程到渲染进程的消息流

preload.ts 中的 contextBridge.exposeInMainWorld:ipcRenderer 接收到来自 main.ts 的消息但渲染器没有得到它