Selenium 超时接收来自渲染器的消息
Posted
技术标签:
【中文标题】Selenium 超时接收来自渲染器的消息【英文标题】:Selenium Timed out receiving message from renderer 【发布时间】:2018-07-05 03:47:17 【问题描述】:在 Chrome 昨天发布最新版本 (64.0.3282) 后,我现在偶尔收到此错误:
从渲染器接收消息超时:600.000
我在一个 docker 容器中运行了大约 2,000 个硒测试,我看到这个失败的概率约为 100 分之一。据我所知,没有可重复的步骤 - 每次迭代失败的测试都不同.我更新到最新的 Chromedriver (2.35),但这似乎没有任何效果。我以前使用的是 Selenium 2.41,但已经更新到最新版本(3.8.1),希望它可能会有所帮助......它没有。我完全不知道为什么会发生这种情况。有没有其他人注意到这一点?这可能是 Chrome 最新版本的错误吗?
提前感谢您提供的任何帮助。
【问题讨论】:
自从 selenium/standalone-chrome docker 镜像在大约 20 天前更新后,我在 Jenkins 中看到了同样的问题。访问第一页有效,但之后访问任何其他页面失败并显示上述相同消息。在图像更新之前,测试运行良好一年多。 相同的图像/Chrome 驱动程序在我的本地机器上完美运行。仅在 Jenkins 中失败。 发生在 chromedriver v80 只是为了添加我对相同问题的经验:问题是我没有在脚本末尾退出驱动程序,因此缺少driver.quit()
是罪魁祸首。您可以通过检查是否仍有运行 chromedriver 可执行文件来查看您是否属于这种情况。
【参考方案1】:
检查 JS 运行时
首先确认您没有执行/eval()
ing 大量的 javascript。这可能会导致超时。
检查版本兼容性
首先,验证您的版本:
硒 JDK Chrome 驱动程序铬
都是兼容的。祝你好运,因为没有一个地方可以记录它,而且 selenium 软件不够聪明,无法快速检查(应该)
检查驱动初始化
添加这个神秘的代码块,我喜欢称之为“不断增长的无用参数列表”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://***.com/a/26283818/1689770
options.addArguments("enable-automation"); // https://***.com/a/43840128/1689770
options.addArguments("--headless"); // only if you are ACTUALLY running headless
options.addArguments("--no-sandbox"); //https://***.com/a/50725918/1689770
options.addArguments("--disable-infobars"); //https://***.com/a/43840128/1689770
options.addArguments("--disable-dev-shm-usage"); //https://***.com/a/50725918/1689770
options.addArguments("--disable-browser-side-navigation"); //https://***.com/a/49123152/1689770
options.addArguments("--disable-gpu"); //https://***.com/questions/51959986/how-to-solve-selenium-chromedriver-timed-out-receiving-message-from-renderer-exc
driver = new ChromeDriver(options);
来源:
https://www.skptricks.com/2018/08/timed-out-receiving-message-from-renderer-selenium.html https://***.com/a/26283818/1689770 https://***.com/a/43840128/1689770 https://***.com/a/50725918/1689770 https://***.com/a/43840128/1689770 https://***.com/a/50725918/1689770 https://***.com/a/49123152/1689770 how to solve Selenium ChromeDriver Timed out receiving message from renderer exception【讨论】:
修复的详细列表做得很好。 --disable-gpu 选项对我有用,经过数小时的 4 行代码,我现在有了屏幕截图。如果您在 VM 上运行 Linux,则此选项使 Web 驱动程序工作。 相关:如果你的截图是黑色的,也可能是你的主机是锁屏的Windows 太棒了。谢谢。通过添加这些选项,从噩梦调试场景到我的测试。繁荣:+1 干杯 执行js的时间好像太长了,试试这个driver.manage().timeouts().pageLoadTimeout(30L, TimeUnit.SECONDS)
,driver.manage().timeouts().setScriptTimeout(3L, TimeUnit.SECONDS)
。注意 pageLoadTimeout 和 scriptTimeout 一样大
如果您之前添加了disable-features=VizDisplayCompositor
,则需要在 Chrome 79 中将其删除,否则会再次出现。【参考方案2】:
我今天遇到了这个问题,使用 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 Chrome 驱动程序版本?我使用的是 2.53,而setPageLoadStrategy
不是 ChromeOptions
class 的方法。
我升级到 Selenium-java 版本 3.141.59 并尝试了这些选项,它也对我有用。我仍在使用 Chrome 网络驱动程序版本 2.45.615291。
这是 Chrome 浏览器版本。这和我用的一样。
我已使用本指南自定义版本:chromedriver.chromium.org/downloads/version-selection 使用这些可供下载:chromedriver.chromium.org/downloads【参考方案3】:
最新的 Chrome 版本似乎存在问题。如果没有设置 disable-gpu Chromeoption,渲染器偶尔会超时。在 Google 修复此问题(如果他们确实修复它)之前的解决方法是将 --disable-gpu 属性添加到 ChromeOptions。
编辑:这减少了发生的频率,但它仍在发生。
【讨论】:
更多信息/讨论bugs.chromium.org/p/chromium/issues/… 使用 :--disable-gpu: 后效果如何? 它有点帮助,但问题仍然出现。 添加 --disable-gpu 对我来说根本没有改善故障。 连接 Chrome 超时,放弃。对我来说,这个错误来了,在添加 --disable-gpu 之后。【参考方案4】:根本原因: 每当您在 selenium 驱动程序的帮助下加载某个页面时,驱动程序 脚本都会等待页面完全加载。但有时 webdriver 需要更多时间来加载页面,在这种情况下,您会在控制台中看到 TimeoutException 异常。
解决方案:当页面加载等待时间过长时,我们将等待带有页面加载策略的 DOMContentLoaded 事件。这种页面加载策略称为Eager。可用的所有 3 种页面加载策略的小定义。
1.正常:此策略导致 Selenium 等待整个页面加载(html 内容和子资源下载并解析)。
2。急切: 这个策略导致 Selenium 等待 DOMContentLoaded 事件(仅下载和解析 html 内容)。
3. none : 这个策略导致 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][SEVERE]:接收超时 来自渲染器的消息:0.100 [1581412934.066][SEVERE]:超时 从渲染器接收消息:0.100 [1581412934.168][SEVERE]:定时 从渲染器接收消息:0.100 [1581412934.360][SEVERE]: 从渲染器接收消息超时:0.100 [1581412934.461][严重]:从渲染器接收消息超时: 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]:定时 out 从渲染器接收消息: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
【讨论】:
@MansoorShaikh 这是解决方法,因为当我发布此答案时,chrome 驱动程序二进制文件有一个错误(我记得 chrome 驱动程序 89)我建议您尝试最新的 chrome 驱动程序。我希望现在应该修复这个错误。【参考方案5】:v93 破坏了我的代码,我最终尝试了很多选项,以下代码对我来说工作正常。
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--disable-gpu");
WebDriverManager.chromedriver().forceDownload().setup();
webDriver = new ChromeDriver(chromeOptions);
【讨论】:
谢谢!我遇到了同样的问题,你的解决方案奏效了!你是怎么想出来的? 我们在 v93 中也有类似的中断,添加--disable-gpu
也解决了它。
@wishman 经过反复试验,花费超过 2 小时。
首先,感谢您注意到此解决方案。但是有人可以解释为什么这是解决方法吗?
本地执行完全没问题,但是当我们在任何 VM 中部署我们的代码时。它没有像我们预期的那样工作。 Chrome 正在打开但没有执行任何操作。所以我们提出了这种方法。【参考方案6】:
在我们的案例中,我们发现问题是性能问题,因为截取的屏幕截图很大,但发生这种情况是因为我们意识到 Chrome 创建的屏幕截图的屏幕截图分辨率比调用 chromedriver 的代码中指定的分辨率高一倍,例如,如果我们在屏幕截图中指定宽度 1024 像素和高度 2000 像素,它会创建一个宽度为 2048 像素,高度为 4000 像素的图像,这就是为什么渲染需要太多时间并且超时会中断进程,以防进程完成(经过长时间等等)它正在创建一个沉重的屏幕截图图像。我们发现它是 Chrome 支持视网膜设备的一个选项(问题),它增加了屏幕截图的分辨率,因此,我们强制使用一个标志来停用该选项并呈现配置的原始分辨率,它运行良好,需要 8 秒到创建截图需要 13 秒(取决于页面内容),并且图像大小小于开始时的大小。这是 ChromeOptions 对象中的标志:
options.addArguments("--force-device-scale-factor=1");
【讨论】:
【参考方案7】:如果您的网站是 https,并且 chromedriver 出现超时问题,请使用
option.addArguments("enable-features=NetworkServiceInProcess")
如果上述方法不起作用,请使用
option.addArguments("disable-features=NetworkService")
改为
归功于https://groups.google.com/forum/#!topic/chromedriver-users/yHuW_Z7tdy0
【讨论】:
在我尝试了此页面上的所有其他内容但没有运气之后,这对我有用。谢谢!【参考方案8】:首先,其他答案很有帮助,作为每个人,我也一直在努力使 chrome webdriver 工作,使用它所需的无穷无尽的参数列表。 以下是我在思考了一段时间后的一些观察:
由于手动设置 webdriver 的超时而收到超时错误。
driver.set_page_load_timeout(30)
我们可以跳过这一行并解决错误,但如果网站继续加载,webdriver 将无限期运行,因此始终建议使用。
首先,确保 chrome 驱动程序和 chrome 在稳定的近期交叉兼容版本上。 (最常见的错误) 由于我将 docker 用于我的用例,我让我的代码处理在 docker 构建期间下载 chrome 和 chromedriver 的最新稳定版本,以排除兼容性问题。 请参阅here 以获得相同的简单解释。
其次,以下参数帮助我以无头方式运行 chromedriver,没有任何问题。 我很惊讶这些论点在任何地方都没有得到很好的记录。找到了很好的文档here
--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 才能工作。 因此,在使用 webdriver 之前添加下面这段代码可以解决所有问题。
from pyvirtualdisplay import Display
display = Display(visible=0, size=(1024, 768))
display.start()
【讨论】:
+1 专门用于向我指出使用set_page_load_timeout
调整超时的能力。我认为即使您不调用它,也可能存在默认值,并且在许多情况下,默认值可能太低了。
非常感谢!在尝试了 23 个不同的参数(包括您在此处列出的最后两个参数以及我以前从未见过的参数)之后,我终于能够按预期在 Google Cloud 中的 Debian 机器上运行 Python 脚本...【参考方案9】:
我看到从 Chrome 72 到 73 的问题并收到错误消息:
Timed out receiving message from renderer: 600.000
只有当我在 Jenkins 上运行测试时(测试在我的本地开发机器上运行良好)我才收到错误,我觉得这很奇怪。
我尝试了 Firefox,但没有发现任何问题,因此将其范围缩小到 Chrome。在浏览了 Chromium 问题跟踪器后,我发现了 Issue 946441: Chromedriver: Timed out receiving message from renderer error for Selenium+Chrome+Jenkins(user SYSTEM)
由于这是一个渲染器问题,我尝试在无头模式下运行测试,从而解决了该问题。
【讨论】:
【参考方案10】:我在从 Jenkins 触发执行时遇到了同样的问题。我玩了一下,发现只有添加下面的 chrome 选项才能使事情起作用:
options.addArguments("--no-sandbox");
【讨论】:
【参考方案11】:听起来很傻,但是当循环没有结束时,请尝试检查您的互联网连接。
【讨论】:
【参考方案12】:只是插件希望这会对某人有所帮助:如果您在 python3 中编码
您在使用 options.addArguments("--xxx") 时遇到类似 Instance of 'Options' has no 'addArguments' memberpylint(no-member) 的错误那么您需要将 addArguments 更改为 add_arguments 喜欢:options.add_argument("--xxxx")
【讨论】:
【参考方案13】:在 2018 年 1 月下旬更新 docker selenium/standalone-chrome 映像后,在 Jenkins 构建环境中运行的 Cucumber 测试中,我看到 Timed out receiving message from renderer:
aka Net::ReadTimeout
问题 100% 的时间。添加 -- ChromeOptions 的 disable-gpu 属性并没有为我修复它,但添加 --disable-browser-side-navigation
选项修复了它 100%。我在这里找到了该建议:https://bugs.chromium.org/p/chromedriver/issues/detail?id=2239#c10
它说这个问题有几种解决方法:
Chrome v65 中有一个修复程序,目前在测试版中可用。如果您可以使用 beta 版本,这是最好的选择。
将 --disable-browser-side-navigation 开关添加到 Chrome 命令行。
使用 ChromeDriver 2.33,它会自动使用 --disable-browser-side-navigation。
【讨论】:
【参考方案14】:我知道有关 Chromedriver 的问题,但对于像我这样没有专门在 Chrome 上进行测试并且只需要在 Selenium 中工作的无头浏览器的人:切换到 Firefox (Geckodriver)。我设置了一个选项并忘记了所有这些 Chromedriver 错误和渲染问题:
from selenium.webdriver.firefox.options import Options
options = Options()
options.headless = True
browser = webdriver.Firefox(options=options)
它只是工作(tm)。
【讨论】:
【参考方案15】: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);
【讨论】:
【参考方案16】:您需要禁用 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);
【讨论】:
【参考方案17】:您可以通过在静默模式下运行 Chromedriver 可执行文件来克服这些超时错误
System.setProperty("webdriver.chrome.driver","driver_path");
System.setProperty("webdriver.chrome.silentOutput", "true");
【讨论】:
【参考方案18】:我发现在我的案例中,零星的故障是因为 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 等高速率下,渲染器会经常超时。
【讨论】:
【参考方案19】:这行得通 在谷歌搜索了许多线程之后,我终于找到了解决此类问题的方法。
虽然上面的大多数解决方案都正确指出了由于 Chrome 更新中的错误而引起的问题,但请按照以下解决方案进行修复-
-
下载并使用最新的ChromeDriver-与Chrome版本兼容
从https://www.selenium.dev/ 下载最新的 Selenium 驱动程序并在您的系统上执行一次 jar 文件。
再次运行你的代码来看看魔法
【讨论】:
【参考方案20】:似乎由于网络问题,浏览器没有加载 URL,或者您在之前的执行中使用 driver.quit() 停止了驱动程序
【讨论】:
以上是关于Selenium 超时接收来自渲染器的消息的主要内容,如果未能解决你的问题,请参考以下文章
错误 [严重]:从渲染器接收消息超时:20.000 在 Jenkins 上通过 Selenium 执行测试套件时
从渲染器接收消息超时:0.100 条日志消息使用 ChromeDriver 和 Chrome v80 通过 Selenium Java
Selenium-Chrome-Headless:无法从渲染器接收消息
preload.ts 中的 contextBridge.exposeInMainWorld:ipcRenderer 接收到来自 main.ts 的消息但渲染器没有得到它