Bra*_*ell 20 selenium google-chrome 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最新版本的错误吗?
提前感谢您提供的任何帮助.
Jon*_*han 37
首先验证你没有下载/处理/评估()很多javascript.这可能会导致超时.
首先,验证您的版本:
铬
都是兼容的.祝你好运,因为没有一个地方记录它,而且selenium软件不够聪明,不能快速检查(它应该)
添加这个神秘的代码块
关于堆栈溢出的每个问题的最新版本: 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-infobars"); //https://stackoverflow.com/a/43840128/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);
Run Code Online (Sandbox Code Playgroud)
资料来源:
小智 15
我今天在 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);
Run Code Online (Sandbox Code Playgroud)
小智 14
v93 破坏了我的代码,我最终尝试了很多选项,以下代码对我来说工作正常。
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--disable-gpu");
WebDriverManager.chromedriver().forceDownload().setup();
webDriver = new ChromeDriver(chromeOptions);
Run Code Online (Sandbox Code Playgroud)
Muz*_*mil 10
根本原因:每当您在 selenium 驱动程序的帮助下加载某个页面时,驱动程序脚本都会等待页面完全加载。但有时 webdriver 需要更多时间来加载页面,在这种情况下,您将在控制台中看到TimeoutException异常。
解决方案:当页面加载等待时间过长时,我们将使用页面加载策略等待DOMContentLoaded 事件。这种页面加载策略称为Eager。可用的所有 3 种页面加载策略的小定义。
1. normal:这个策略导致Selenium等待整个页面加载(html内容和子资源下载和解析)。
2.eager :这个策略导致Selenium 等待DOMContentLoaded 事件(只下载和解析html 内容)。
3. none :这个策略导致Selenium在初始页面内容完全接收(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();
Run Code Online (Sandbox Code Playgroud)
控制台输出:
在端口 41540 上启动 ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs/branch-heads/3987@{#185}) 仅允许本地连接。请保护 ChromeDriver 和相关测试框架使用的端口,防止恶意代码访问。2020 年 2 月 11 日上午 10:22:12 org.openqa.selenium.remote.ProtocolHandshake createSession INFO:检测到方言:W3C [1581412933.937][SEVERE]:从渲染器接收消息超时:0.104016E.SEVER.SEVER.从渲染器接收消息:0.100 [1581412934.168][SEVERE]:从渲染器接收消息超时:0.100 [1581412934.360][SEVERE]:从渲染器接收消息超时:0.100 [158141612134] 从渲染器接收消息超时:0.100 0.100 [1581412934.618][SEVERE]:从渲染器接收消息超时:0。
使用 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();
Run Code Online (Sandbox Code Playgroud)
控制台输出:
在端口 1175 上启动 ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs/branch-heads/3987@{#185}) 仅允许本地连接。请保护 ChromeDriver 和相关测试框架使用的端口,防止恶意代码访问。2020 年 2 月 11 日上午 10:29:05 org.openqa.selenium.remote.ProtocolHandshake createSession 信息:检测到的方言:W3C 21
小智 7
在我们的例子中,我们发现问题是一个性能问题,因为截取的屏幕截图很大,但它的发生是因为我们意识到 Chrome 创建的屏幕截图的屏幕截图分辨率是调用 chromedriver 代码中指定的两倍,例如,如果我们在屏幕截图中指定宽度 1024px 和高度 2000px,它正在创建一个宽度为 2048px 和高度为 4000px 的图像,这就是为什么渲染花费太多并且超时会中断进程,如果进程完成(经过长时间等待)它正在创建大量的屏幕截图图像。我们发现这是 Chrome 的一个选项(问题),用于支持视网膜设备,从而提高了屏幕截图的分辨率,因此,我们强制使用一个标志来停用该选项并渲染配置的原始分辨率,并且效果很好,需要 8 秒才能完成创建屏幕截图需要 13 秒(取决于页面内容),并且图像尺寸小于开始时的尺寸。这是 ChromeOptions 对象中的标志:
options.addArguments("--force-device-scale-factor=1");
Run Code Online (Sandbox Code Playgroud)
似乎最新的Chrome版本存在问题。如果未设置disable-gpu Chromeoption,则渲染器有时会超时。在Google修复此问题(如果他们确实解决了)之前,解决方法是将--disable-gpu属性添加到ChromeOptions。
编辑:这减少了发生的频率,但它仍在发生。
首先,其他答案提供了很大的帮助,和每个人一样,我也一直在努力使 chrome webdriver 工作,使用它所需的无穷无尽的参数列表。以下是我在思考这个问题一段时间后的一些观察:
由于手动设置网络驱动程序的超时而收到超时错误。
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
Run Code Online (Sandbox Code Playgroud)
第三,经过上述配置后,我面临的问题是,当我在 Windows 上运行时,它可以在 docker 容器中运行,但无法在 Linux/Kubernetes 上运行。原因是,对于 Linux,它需要 PyVirtualDisplay 才能工作。因此,在使用网络驱动程序之前添加下面的代码可以解决所有问题。
from pyvirtualdisplay import Display
display = Display(visible=0, size=(1024, 768))
display.start()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20101 次 |
| 最近记录: |