Selenium ChromeDriver超时接收来自渲染器异常

时间:2016-01-21 14:48:12

标签: java google-chrome selenium-webdriver selenium-chromedriver

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

在我的研究中,我遇到了对我不起作用的解决方案:

  1. 而不是隐式等待使用Thread.sleep
  2. 替换新的RemoteWebDriver(service.getUrl(),capabilities);通过新的ChromeDriver(服务,功能);
  3. 在新的ChromeDriver(...)之后,使用Thread.sleep(1000)等待1秒;
  4. 任何人都可以告诉我为什么会出现这个错误?如何处理?

    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;
        }
    }
    

    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);
            }
        }
    }
    

    连接到目标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功能   [{applicationCacheEnabled = false,rotate = false,   mobileEmulationEnabled =假,   铬= {userDataDir = / TMP / .com.google.Chrome.rgDfCi},   takesHeapSnapshot = true,databaseEnabled = false,handlesAlerts = true,   hasTouchScreen = false,版本= 45.0.2454.101,platform = LINUX,   browserConnectionEnabled = false,nativeEvents = true,   acceptSslCerts = true,locationContextEnabled = true,   webStorageEnabled = true,browserName = chrome,takesScreenshot = true,   javascriptEnabled = true,cssSelectorsEnabled = true}]会话ID:   a97aeb9a53ddd77e8edfac64019cc599 at   sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)     在   sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)     在   sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)     at java.lang.reflect.Constructor.newInstance(Constructor.java:422)     在   org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206)     在   org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)     在   org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:647)     在   org.openqa.selenium.remote.RemoteWebDriver.get(RemoteWebDriver.java:311)     在   org.openqa.selenium.remote.RemoteWebDriver $ RemoteNavigation.to(RemoteWebDriver.java:927)     在app.core.browsers.chrome.Chrome.navigateTo(Chrome.java:112)at   app.core.extensions.tests.ShouldPostToServerTest.nav(ShouldPostToServerTest.java:58)     在   app.core.extensions.tests.ShouldPostToServerTest.setTest(ShouldPostToServerTest.java:49)

2 个答案:

答案 0 :(得分:5)

您的代码运行正常。你可能会使用过时的镀铬驱动程序。我建议使用最新的chrome驱动程序。

答案 1 :(得分: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

...表示 ChromeDriver 无法启动/产生新的浏览上下文,即 Chrome浏览器会话。

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

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

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


解决方案

确保:

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