Selenium 从渲染器接收消息超时



Chrome昨天发布了最新版本(64.0.3282)后,我现在偶尔收到此错误:

从渲染器接收消息超时:600.000

我在 docker 容器中运行了大约 2,000 次硒测试,我看到这种失败的速度约为 1/100。据我所知,没有可重现的步骤 - 每次迭代失败的测试都不同。我更新到最新的Chromedriver(2.35),但这似乎没有任何影响。我以前使用的是Selenium 2.41,但已更新到最新版本(3.8.1),希望它可能会有所帮助......它没有。我完全不知道为什么会发生这种情况。还有其他人注意到这一点吗?它可能是Chrome最新版本的错误吗?

提前感谢您提供的任何帮助。

检查 JS 运行时

首先验证你没有执行/eval()大量的javascript。这可能会导致超时。

检查版本兼容性

首先,验证您的版本:

  • 京东
  • ChromeDriver

都是兼容的。祝你好运,因为没有一个地方可以记录它,而且硒软件不够聪明,无法进行快速检查(它应该)

检查驱动程序初始化

添加这个神秘的代码块,我喜欢称之为"不断增长的无用参数列表"chromedriver 需要

截至2018 年 9 月报告的每个堆栈溢出问题的最新

情况
// ChromeDriver is just AWFUL because every version or two it breaks unless you pass cryptic arguments
//AGRESSIVE: options.setPageLoadStrategy(PageLoadStrategy.NONE); // https://www.skptricks.com/2018/08/timed-out-receiving-message-from-renderer-selenium.html
options.addArguments("start-maximized"); // https://stackoverflow.com/a/26283818/1689770
options.addArguments("enable-automation"); // https://stackoverflow.com/a/43840128/1689770
options.addArguments("--headless"); // only if you are ACTUALLY running headless
options.addArguments("--no-sandbox"); //https://stackoverflow.com/a/50725918/1689770
options.addArguments("--disable-dev-shm-usage"); //https://stackoverflow.com/a/50725918/1689770
options.addArguments("--disable-browser-side-navigation"); //https://stackoverflow.com/a/49123152/1689770
options.addArguments("--disable-gpu"); //https://stackoverflow.com/questions/51959986/how-to-solve-selenium-chromedriver-timed-out-receiving-message-from-renderer-exc
driver = new ChromeDriver(options);
//This option was deprecated, see https://sqa.stackexchange.com/questions/32444/how-to-disable-infobar-from-chrome
//options.addArguments("--disable-infobars"); //https://stackoverflow.com/a/43840128/1689770

来源:

  • https://www.skptricks.com/2018/08/timed-out-receiving-message-from-renderer-selenium.html
  • https://stackoverflow.com/a/26283818/1689770
  • https://stackoverflow.com/a/43840128/1689770
  • https://stackoverflow.com/a/50725918/1689770
  • https://stackoverflow.com/a/49123152/1689770
  • 如何解决硒铬驱动程序从渲染器异常接收消息
  • 超时

我今天遇到了这个问题,使用 Chrome:版本 73.0.3683.86(官方版本)(64 位)。对我来说,它在 Jenkins 构建的超时时失败了,并且在本地很好,请参阅以下帮助我克服该问题的 Chrome 选项(此时的 ChromeDriver:版本 - 73.0.3683.68):

ChromeOptions options = new ChromeOptions();
options.addArguments("enable-automation");
options.addArguments("--headless");
options.addArguments("--window-size=1920,1080");
options.addArguments("--no-sandbox");
options.addArguments("--disable-extensions");
options.addArguments("--dns-prefetch-disable");
options.addArguments("--disable-gpu");
options.setPageLoadStrategy(PageLoadStrategy.NORMAL);

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

解决方案:当页面加载花费太多时间等待时,我们将等待带有页面加载策略的DOMContentLoaded 事件。此页面加载策略称为Eager。所有 3 种可用页面加载策略的一小部分定义。

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

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

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

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

不使用页面加载策略的代码片段(或默认情况下由硒使用的正常)

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

看起来最新的Chrome版本存在问题。如果没有设置禁用 gpu Chrome选项,渲染器偶尔会超时。在Google解决此问题之前(如果他们确实修复了它)之前的解决方法是将--disable-gpu属性添加到ChromeOptions中。

编辑:这减少了发生的频率,但它仍在发生。

v93 破坏了我的代码,我尝试了很多选项 最后,以下代码对我来说工作正常。

ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--disable-gpu");
WebDriverManager.chromedriver().forceDownload().setup();
webDriver = new ChromeDriver(chromeOptions);

在我们的例子中,我们发现问题是一个性能问题,因为截图很大,但它的发生是因为我们意识到 Chrome 创建的屏幕截图的屏幕截图分辨率是调用 chromedriver 的代码中指定的两倍,例如,如果我们在屏幕截图中指定宽度 1024px 和高度 2000px, 它正在创建 2048px 宽度和 4000px 高度的图像,这就是为什么渲染花费太多并且超时会中断该过程的原因,如果该过程完成(经过长时间等待)它正在创建一个繁重的屏幕截图图像。我们发现这是Chrome的一个选项(问题),用于支持视网膜设备,从而提高屏幕截图的分辨率,因此,我们强制使用标志停用该选项并呈现配置的原始分辨率,并且效果很好,需要8秒到13秒来创建屏幕截图(取决于页面的内容),并且图像大小小于生成。这是ChromeOptions对象的标志:

options.addArguments("--force-device-scale-factor=1");

首先,所有其他答案都有很大的帮助,和每个人一样,我也一直在努力使chrome网络驱动程序工作,使用它所需的无穷无尽的参数列表。 以下是我对此断头一段时间后的一些观察:

由于手动设置 Web 驱动程序的超时,收到超时错误。driver.set_page_load_timeout(30)我们可以跳过这一行并解决错误,但是如果网站继续加载,网络驱动程序将无限期运行,因此始终建议使用。

首先,确保chrome驱动程序和chrome在稳定的最近交叉兼容版本上。(最常见的错误) 由于我在用例中使用 docker,因此我让我的代码句柄在 docker 构建期间下载 chrome 和 chromedriver 的最新稳定版本,以排除兼容性问题。 有关相同的简单说明,请参阅此处。

其次,以下论点帮助我将chromedriver作为无头运行,没有任何问题。 我很惊讶这些论点在任何地方都没有很好的记录。在这里找到很好的文档

--no-sandbox
window-size=1920,1080
--ignore-certificate-errors
--ignore-ssl-errors
--disable-dev-shm-usage
--disable-gpu")
--log-level=3")
enable-features=NetworkServiceInProcess
disable-features=NetworkService

第三,在上述配置之后,我面临的问题是它在Windows上运行时在docker容器中为我工作,但在Linux/Kubernetes上运行失败。 原因是,对于Linux来说,它需要一个PyVirtualDisplay才能工作。 因此,在使用 Web 驱动程序之前添加以下代码段解决了所有问题。

from pyvirtualdisplay import Display
display = Display(visible=0, size=(1024, 768)) 
display.start()

如果您的网站是https,并且在超时问题上遇到Chromeedriver问题,请使用

option.addArguments("enable-features=NetworkServiceInProcess")

如果上述方法不起作用,请使用

option.addArguments("disable-features=NetworkService") 

相反

功劳归于 https://groups.google.com/forum/#!topic/chromedriver-users/yHuW_Z7tdy0

我看到从Chrome 72到73的问题,并收到错误消息:

Timed out receiving message from renderer: 600.000

只有当我在 Jenkins 上运行测试时,我才收到错误(测试在我的本地开发机器上运行良好),我觉得这很奇怪。

我尝试了Firefox,但没有发现任何问题,因此将其缩小到Chrome。查看Chromium问题跟踪器后,我发现了问题946441:Chromedriver:从Selenium + Chrome + Jenkins(用户系统)的渲染器错误接收消息超时

由于这是一个渲染器问题,我尝试以无头模式运行测试以解决问题。

在 2018 年 1 月下旬更新 docker 硒/独立铬映像后,我在 Jenkins 构建环境中运行的黄瓜测试中看到Timed out receiving message from renderer:又名Net::ReadTimeout100% 的问题。将 --disable-gpu 属性添加到 ChromeOptions 并没有为我修复它,但添加--disable-browser-side-navigation选项可以 100% 修复它。 我在这里找到了这个建议:https://bugs.chromium.org/p/chromedriver/issues/detail?id=2239#c10

它说这个问题有几种解决方法:

  • Chrome v65 中有一个修复程序,目前在测试版中可用。如果您可以使用测试版,这是最佳选择。

  • 将禁用浏览器侧导航开关添加到 Chrome 命令行。

  • 使用
  • ChromeDriver 2.33,它会自动使用 --disable-browser-side navigation。

我在触发 Jenkins 执行时遇到了同样的问题。我玩了一下,发现只有添加下面的 chrome 选项才能正常工作:

options.addArguments("--no-sandbox");

听起来很傻,但是当循环没有结束时,请尝试检查您的互联网连接。

只是插件希望这会帮助某人:如果你用python3
编码

在使用 options.addArguments("--xxx")时,您会收到错误,例如">选项"的实例没有"addArguments"memberpylint(no-member),然后您需要将addArguments更改为add_arguments
例如:options.add_argument("--xxxx")

我知道这个问题是关于Chromedriver的,但对于像我这样没有专门在Chrome上测试并且只需要在Selenium中工作的无头浏览器的人来说:切换到Firefox(Geckodriver)。我设置了一个选项,忘记了所有这些Chromedriver错误和渲染问题:

from selenium.webdriver.firefox.options import Options
options = Options()
options.headless = True
browser = webdriver.Firefox(options=options)

它只是工作(tm)。

In order to execute chrome test cases parallel in a headless mode using jenkins 
options.addArguments("--no-sandbox"); 
options.addArguments("--disable-dev-shm-usage"); 
options.addArguments("--aggressive-cache-discard"); 
options.addArguments("--disable-cache"); 
options.addArguments("--disable-application-cache"); 
options.addArguments("--disable-offline-load-stale-cache"); 
options.addArguments("--disk-cache-size=0");
options.addArguments("--headless"); 
options.addArguments("--disable-gpu"); 
options.addArguments("--dns-prefetch-disable"); 
options.addArguments("--no-proxy-server"); 
options.addArguments("--log-level=3"); options.addArguments("--silent"); options.addArguments("--disable-browser-side-navigation"); options.setPageLoadStrategy(PageLoadStrategy.NORMAL); 
options.setProxy(null);

您需要禁用ChromeDriverService记录器。

将以下方法添加到创建驱动程序的任何类,

并确保在创建任何驱动程序实例之前调用它一次:

import org.openqa.selenium.chrome.ChromeDriverService;
import java.util.logging.Level;
import java.util.logging.Logger;
public static void disableSeleniumLogs() {    
System.setProperty(ChromeDriverService.CHROME_DRIVER_SILENT_OUTPUT_PROPERTY, "true");
Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF);
}

您可以通过在静默模式下运行Chromedriver可执行文件来克服这些超时错误

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

我发现在我的情况下,零星的故障是因为服务器上的 CPU 资源会偶尔上升和下降,这会改变在页面上呈现元素或执行 JS 所需的时间。因此,我的最终解决方案是简单地增加超时,如下所示:

// Driver constants and methods
const STD_TIMEOUT = 100000
let setDriverTimeout = async (timeout) => {
await global.driver.manage().setTimeouts({
implicit: timeout,
pageLoad: timeout,
script: timeout
})
}

在这里,如果我使用太小的STD_TIMEOUT,我会得到更多的错误"从渲染器接收消息超时"。

另外,作为旁注,我可以通过提高 CPU 限制率来更频繁地触发这种情况发生:

global.driver = await new Builder()
.forBrowser('chrome')
.setChromeOptions(options)
.build()
await driver.sendDevToolsCommand(
'Emulation.setCPUThrottlingRate', {
rate: 1800
}
);

对于高速率(如 1800),渲染器将经常超时。

这有效 在谷歌搜索了许多线程之后,我终于得到了此类问题的解决方案。

虽然上面的大多数解决方案都正确指出了由于Chrome更新中的错误而引起的问题,但请按照以下解决方案进行修复-

  1. 下载并使用最新的ChromeDriver-与Chrome版本兼容
  2. 从 https://www.selenium.dev/下载最新的硒驱动程序,并在系统上执行一次jar文件。
  3. 再次运行 you 代码以查看魔术

似乎浏览器由于网络问题而没有加载 URL,或者您在之前的执行中使用 driver.quit() 退出了驱动程序

我在 jenkins 作业运行期间遇到了同样的问题。对我有用的修复程序是在 jenkins 用户下.bash_profile中设置代理:

sudo su -s /bin/bash jenkins
nano ~/.bash_profile
...your proxy
source ~/.bash_profile

唯一可靠地重现Timed out receiving message from renderer错误的调整是将页面加载超时设置得太低(在我的测试中,"太低"低于 10 秒时通过远程和过载的匿名代理测试缓慢加载的网页)。

这解决了它:

chrome_driver.set_page_load_timeout(PAGE_LOAD_TIMEOUT_SEC)


默认值为 300 秒(请参阅有关超时的 Web 驱动程序文档),因此您或其他人可能已将其自定义为较短的值才能导致问题。

根据我的测试,这里提出的其余"魔术"设置/调整并不是绝对必要的。

最新更新