从渲染器接收消息超时: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
到启用对导航状态的额外检查。但是,不幸的是,当超时到期时,它被记录为 SEVERE(ProcessNextMessage
)。在这个小超时的情况下,它不应记录为 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");
我们最近使用 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
到启用对导航状态的额外检查。但是,不幸的是,当超时到期时,它被记录为 SEVERE(ProcessNextMessage
)。在这个小超时的情况下,它不应记录为 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");