Selenium超时从渲染器接收消息

时间:2018-01-25 19:35:19

标签: google-chrome selenium selenium-chromedriver

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

  

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

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

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

17 个答案:

答案 0 :(得分:7)

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

解决方案::当页面加载需要太多时间等待时,我们将使用页面加载策略等待 DOMContentLoaded事件。此页面加载策略称为渴望。对所有3种页面加载策略的可用定义。

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

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

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

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

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

控制台输出:

启动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

具有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 INFO: 检测到的方言:W3C 21

答案 1 :(得分:5)

最新的Chrome版本似乎存在问题。如果没有disable-gpu Chromeoption设置,渲染器偶尔会超时。谷歌修复此问题(如果他们确实修复了它)之前的解决方法是将--disable-gpu属性添加到ChromeOptions。

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

答案 2 :(得分:4)

我今天在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);

答案 3 :(得分:2)

我看到从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)

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

答案 4 :(得分:2)

从詹金斯触发执行时遇到了相同的问题。我试了一下,发现只有添加以下chrome选项才可以使事情工作:

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

答案 5 :(得分:1)

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

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

如果上述方法无效,请使用

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

代替

贷方转到https://groups.google.com/forum/#!topic/chromedriver-users/yHuW_Z7tdy0

答案 6 :(得分:1)

首先,其他答案对每个人都有很大帮助,我也一直在努力使 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()

答案 7 :(得分:0)

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

答案 8 :(得分:0)

这个作品 在谷歌搜索了许多线程后,我终于得到了解决此类问题的方法。

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

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

答案 9 :(得分:0)

我发现,在我的情况下,偶发失败是因为 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 等高速率下,渲染器会经常超时。

答案 10 :(得分:0)

只是插件希望这对某人有帮助:如果您使用python3进行编码

在使用 options.addArguments(“-xxx”)时,您收到类似'Options'的实例没有'addArguments'memberpylint(no-member)的错误消息那么您需要将 addArguments 更改为 add_arguments
像: options.add_argument (“-xxxx”)

答案 11 :(得分:0)

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

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

您需要禁用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);
}

答案 14 :(得分:0)

我知道有关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 :(得分:0)

在2018年1月底更新了docker selenium / standalone-chrome图像后,我在Jenkins构建环境中运行的Cucumber测试中100%看到了Timed out receiving message from renderer:又名Net::ReadTimeout问题。将--disable-gpu属性添加到ChromeOptions并没有为我修复,但添加--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。

答案 16 :(得分:-1)

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

options.addArguments("--force-device-scale-factor=1");
相关问题