Selenium ChromeDriver超时从渲染器异常接收消息

use*_*875 6 java google-chrome selenium-chromedriver selenium-webdriver

在我的Java项目中,我使用Selenium进行Web自动化.我正在使用chromedriver v2.20可执行文件.第一个"ChromeDriverService"已初始化,用于创建ChromeDriver,例如"新的ChromeDriver(服务,功能);".我还使用BrowserMobProxy捕获所有Web请求.在我的测试中,我会多次导航到一些URL,每个导航驱动程序隐式等待几秒后,然后轮询结果.但是执行它时会给我超时异常.

在我的研究中,我遇到了不适合我的解决方案:

  1. 而不是hiddenlyWait使用Thread.sleep
  2. 替换新的RemoteWebDriver(service.getUrl(),capabilities); 通过新的ChromeDriver(服务,功能);
  3. 在新的ChromeDriver(...)之后,使用Thread.sleep(1000)等待1秒;

谁能告诉我为什么会出现这个错误?怎么处理这个?

ShouldPostToServerTest.java:

@Test 
public void setTest() throws Exception {
    for (int i = 0; i < 3; i++) {
        nav();
        poll();
    }
}

private void nav() {
    String[] navTo = {"http://www.bestbuy.com","http://www.amazon.com"};
    for (int n = 0; n < 30 / navTo.length; n++) {
        for (String url : navTo) {
            chrome.navigateTo(url);
            chrome.waitFor(5000);
        }
    }
}

private void poll() {
    int pollInterval = 1000;
    int remaining = 120 * 1000;
    boolean found = false;
    while (remaining > 0) {
        if (found) // populateResult(), omitted for now.
            break;

        chrome.waitFor(pollInterval);
        remaining -= pollInterval;
    }
}
Run Code Online (Sandbox Code Playgroud)

Chrome.java:

public void navigateTo(String url) {
    if (driver == null)
        return;

    driver.navigate().to(url); // TimeOut 
}
public void waitFor(long waitFor) {
    long start = System.currentTimeMillis();
    driver.manage().timeouts().implicitlyWait(waitFor, TimeUnit.MILLISECONDS);
    long duration = System.currentTimeMillis() - start;
    long remaining = waitFor - duration;
    if (remaining > 0) {
        try {
            Thread.sleep(remaining);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

连接到目标VM,地址:'127.0.0.1:57086',传输:'socket'在端口13817上启动ChromeDriver 2.20.353124(035346203162d32c80f1dce587c8154a1efa0c3b)仅允许本地连接.SLF4J:无法加载类"org.slf4j.impl.StaticLoggerBinder".SLF4J:默认为无操作(NOP)记录器实现SLF4J:有关更多详细信息,请参阅http://www.slf4j.org/codes.html#StaticLoggerBinder.启用矢量粉碎保护.启用矢量粉碎保护.[723.497] [严重]:超时从渲染器接收消息:600.000 [1323.497] [严重]:超时从渲染器接收消息:600.000

例外:

org.openqa.selenium.WebDriverException:未知错误:无法确定超时的加载状态:超时从渲染器接收消息:600.000(会话信息:chrome = 45.0.2454.101)
(驱动程序信息:chromedriver = 2.20.353124(035346203162d32c80f1dce587c8154a1efa0c3b),平台= Linux 3.19.0-28-generic x86_64)(警告:服务器未提供任何堆栈跟踪信息)命令持续时间或超时:1200.01秒构建信息:版本:'2.48.2',修订版:'41bccdd10cf2c0560f637404c2d96164b67d9d67',时间:' 2015-10-09 13:08:06'系统信息:主机:'yogesh-ubuntu',ip:'127.0.1.1',os.name:'Linux',os.arch:'amd64',os.version: '3.19.0-28-generic',java.version:'1.8.0_60'驱动程序信息:org.openqa.selenium.chrome.ChromeDriver Capabilities [{applicationCacheEnabled = false,rotating = false,mobileEmulationEnabled = false,chrome = {userDataDir =/tmp/.com.google.Chrome.rgDfCi},takesHeapSnapshot = true,databaseEnabled = false,handlesAlerts = true,hasTouchScreen = false,version = 45.0.2454.101,platfor m = LINUX,browserConnectionEnabled = false,nativeSvents = true,locationStextEnabled = true,webStorageEnabled = true,browserName = chrome,takesScreenshot = true,javascriptEnabled = true,cssSelectorsEnabled = true}]会话ID:a97aeb9a53ddd77e8edfac64019cc599 at sun.reflect. sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)中的NativeConstructorAccessorImpl.newInstance0(Native Method)位于sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45),位于java.lang.reflect.Constructor.newInstance(构造函数. java:422)org.openqa.selenium.remote.Arote.Error.Derler.RetponseFailed(ErrorHandler.java:158)org.openqa.selenium.remote的org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206) .rmoteWebDriver.execute(RemoteWebDriver.java:647)org.openqa.selenium.remote.RemoteWebDriver.get(RemoteWebDriver.java:311)org.openqa.selenium.remote.RemoteWebDriver $ RemoteNavigation .to(RemoteWebDriver.java:927)at app.core.browsers.chrome.Chrome.navigateTo(Chrome.java:112)at app.core.extensions.tests.ShouldPostToServerTest.nav(ShouldPostToServerTest.java:58)at app. core.extensions.tests.ShouldPostToServerTest.setTest(ShouldPostToServerTest.java:49)

pra*_*v19 5

您的代码运行良好。可能是您使用了过时的Chrome驱动程序。我建议使用最新版的chrome驱动程序。

  • 尝试做一件事-将chrome驱动程序降级到2.12.301325版本(win 32) (2认同)

Deb*_*anB 0

这个错误信息...

Connected to the target VM, address: '127.0.0.1:57086', transport: 'socket'
Starting ChromeDriver 2.20.353124 (035346203162d32c80f1dce587c8154a1efa0c3b) on port 13817
.
org.openqa.selenium.WebDriverException: unknown error: cannot
determine loading status from timeout: Timed out receiving message
from renderer: 600.000   (Session info: chrome=45.0.2454.101)  
(Driver info: chromedriver=2.20.353124
(035346203162d32c80f1dce587c8154a1efa0c3b),platform=Linux 3.19.0-28-generic x86_64) (WARNING: The server did not provide any stacktrace information) Command duration or timeout: 1200.01 seconds
Build info: version: '2.48.2', revision: '41bccdd10cf2c0560f637404c2d96164b67d9d67', time: '2015-10-09 13:08:06' System info: host: 'yogesh-ubuntu', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '3.19.0-28-generic', java.version: '1.8.0_60' Driver info: org.openqa.selenium.chrome.ChromeDriver
Run Code Online (Sandbox Code Playgroud)

...意味着ChromeDriver无法启动/生成新的浏览上下文,即Chrome 浏览器会话。

您的主要问题是您使用的二进制文件版本之间不兼容,如下所示:

  • 尽管您的chromedriver=2.20chrome=45.0是兼容的。
  • 但你的JDK 版本1.8.0_60,这是相当古老的。

因此JDK v8u60Selenium Client v'2.48.2ChromeDriver v2.20Chrome 浏览器 v45.0之间存在明显的不匹配


解决方案

确保这件事:

  • JDK已升级到当前级别JDK 8u241
  • Selenium升级到当前级别Version 3.141.59
  • ChromeDriver已更新至当前ChromeDriver v80.0级别。
  • Chrome已更新至当前Chrome 版本 80.0级别。(根据ChromeDriver v80.0 发行说明
  • 通过IDE清理项目工作区并仅使用所需的依赖项重建项目。
  • 如果您的基本Web 客户端版本太旧,请卸载它并安装最新的 GA 和发布版本的Web 客户端
  • 重新启动系统
  • @Test非 root用户身份执行。
  • driver.quit()始终在方法内调用tearDown(){}以优雅地关闭和销毁WebDriverWeb Client实例。