angularjs - 加载 Angular SPA 时出现 org.openqa.selenium.TimeoutException

标签 angularjs selenium webdriver-io chrome-web-driver chimp.js

我正在使用chimp.js它通过一些纤维魔法增强了 webdriver.io,以便可以以同步方式定义代码。这是代码:

var c = require('./config');

module.exports = function () {
    this.When(/^I try to login with wrong credentials$/, function () {
        browser.setValue(userNameField, wrongUser);
        browser.setValue(passwordField, wrongPassword);
        browser.click('button[value="Login"]');
    });
    this.When(/^I try to login with the correct credentials$/, function () {
        browser.setValue(userNameField, c.userName);
        browser.setValue(passwordField, c.password);
        console.log('before pressig the button');
        browser.click('button[value="Login"]');
        console.log('logged in');
    });
};

第一个 When 执行得很好。第二个 When 也有效,但我只是看不到

logged in

在控制台上。两者都在同一个网站上运行,并且都单击同一个按钮。第二种情况,登录成功后,浏览器重定向到 Angular SPA。这里一切都正确加载,但仅此而已。回调永远不会发生。

使用 --debug --log=command 运行测试 我看到这是最后一行(超时之前)

[1;30m[01:30:18]: [0m [0;35mCOMMAND [0mPOST      "/wd/hub/session/7c334efe-2417-4184-b43c-082ba4441291/element/11/click"

将日志级别切换为详细,并等待约 5 分钟,我收到以下错误:

[chimp][selenium.stderr] 01:36:59.561 DEBUG - Executed: [0560aaa14e4cf874afd72336c19e299b, clickElement {id=0.6384125368203968-3}]

[chimp][selenium.stderr] 01:37:02.449 WARN - Exception thrown
org.openqa.selenium.TimeoutException: timeout: Timed out receiving message from renderer: 10.000
  (Session info: chrome=47.0.2526.73)
  (Driver info: chromedriver=2.19.346063 (38b35413bd4a486d436a9749e090454bc9ff6708),platform=Mac OS X 10.11.0 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 310.12 seconds
Build info: version: '2.47.1', revision: '411b314', time: '2015-07-30 03:03:16'
System info: host: '<HOST_NAME>', ip: '<IP_ADDRESS>', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.11', java.version: '1.8.0_20'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, chrome={userDataDir=/var/folders/nc/3cdxbvwj44j_gk1qj24mbr5w0000gn/T/.org.chromium.Chromium.1n3kHd}, takesHeapSnapshot=true, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=47.0.2526.73, platform=MAC, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}]
Session ID: 0560aaa14e4cf874afd72336c19e299b
  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
  at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
  at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206)
  at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)
  at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:595)
  at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:273)
  at org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:84)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:483)
  at org.openqa.selenium.support.events.EventFiringWebDriver$EventFiringWebElement$1.invoke(EventFiringWebDriver.java:332)
  at com.sun.proxy.$Proxy3.click(Unknown Source)
  at org.openqa.selenium.support.events.EventFiringWebDriver$EventFiringWebElement.click(EventFiringWebDriver.java:345)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:483)
  at org.openqa.selenium.remote.server.KnownElements$1.invoke(KnownElements.java:64)
  at com.sun.proxy.$Proxy2.click(Unknown Source)
  at org.openqa.selenium.remote.server.handler.ClickElement.call(ClickElement.java:30)
  at org.openqa.selenium.remote.server.handler.ClickElement.call(ClickElement.java:1)
  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
  at org.openqa.selenium.remote.server.DefaultSession$1.run(DefaultSession.java:176)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
  at java.lang.Thread.run(Thread.java:745)

[chimp][selenium.stderr] 01:37:02.458 WARN - Exception: timeout: Timed out receiving message from renderer: 10.000
  (Session info: chrome=47.0.2526.73)
  (Driver info: chromedriver=2.19.346063 (38b35413bd4a486d436a9749e090454bc9ff6708),platform=Mac OS X 10.11.0 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 310.12 seconds
Build info: version: '2.47.1', revision: '411b314', time: '2015-07-30 03:03:16'
System info: host: '<HOST_NAME>', ip: '<IP_ADDRESS>', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.11', java.version: '1.8.0_20'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, chrome={userDataDir=/var/folders/nc/3cdxbvwj44j_gk1qj24mbr5w0000gn/T/.org.chromium.Chromium.1n3kHd}, takesHeapSnapshot=true, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=47.0.2526.73, platform=MAC, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}]
Session ID: 0560aaa14e4cf874afd72336c19e299b

[chimp][selenium.stderr] 01:37:02.471 DEBUG - Finished: POST /session/e103e58b-7ac9-4c8d-8f65-1f60295231d9/element/11/click

加载 SPA 第一页、初始化数据等平均需要 3-7 秒(chrome 停止显示页面正在加载)。超时设置为 10 秒,所以我想增加它,通过

module.exports = function () {
    this.BeforeScenario(function () {
        browser.timeout('script', 60 * 1000);
        browser.timeout('page load', 60 * 1000);
    });
};

但这也没有帮助。知道我可以做什么/尝试吗?

再次澄清 - 登录页面是一个简单的静态服务器端呈现的 HTML。用户登录后,会被重定向到基于 Angular 1.4 的 SPA。使用错误的凭据按下登录按钮可能会起作用,因为我没有重定向到 SPA,而是返回到登录页面。

所有测试均在 Mac OS X El Capitan 上的 Chrome 中运行

更新:

现在它工作一次了。后来我注意到,当我重新加载网站时,脚本会继续运行,以防它卡住。

这里有问题的页面是这样工作的:

  • / 页面被访问并初始化 Angular
  • ui-router 路由到 #/defaultroute
  • Controller 进行初始化并下载一些初始数据
  • 新 Controller 在 ng-repeat 内初始化并下载更多数据

所以,是的,需要下载大量数据并等待整个页面显示。也许这会给 chimp.js 或 webdriver.io 带来麻烦?

当然,从 browser.click(...); 切换到 browser.key(['Enter']); 也不起作用。卡住并重新加载浏览器的相同问题可以解决。看起来 silenium 可能无法让页面真正完成加载。这就是为什么重新加载页面可以修复它。知道如何解决这个问题吗?

顺便说一句,我还提出了一个与此相关的问题:https://github.com/xolvio/chimp/issues/165

更新2:

在 Firefox 和 PhantomJS 中它可以运行,Safari 根本无法运行。

也许此时我只想知道错误在哪里,如果它是一个已知的错误,...

最佳答案

我会做什么来缩小问题范围:

  1. 单独运行单个失败测试(以确保其他测试不会以某种方式产生影响)

  2. 直接访问失败的测试最终(重定向)URL,而不是通过单击按钮。例如(类似于 browser.get('#/defaultroute'));

  3. 检查Angular页面是否不进行轮询(连续setTimeout,间隔),这可能被视为页面未加载/同步(对此表示怀疑,因为它适用于刷新)

关于angularjs - 加载 Angular SPA 时出现 org.openqa.selenium.TimeoutException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33990292/

相关文章:

javascript - 绑定(bind)值以在 2 个 Controller 的 Angular js 中进行选择

javascript - 如何将作用域中的变量注入(inject) Angular Controller ?

java - appium 的此 session 问题不支持定位器策略 'css selector'

java - 如何通过 Selenium 和 Java 单击 <md-select> 下拉列表中文本为 "Phone to call with"的元素

react-native - 比较 Webdriver I/O 和 WD.js

javascript - Chutzpah - 找不到变量 : module

javascript - 如何用 ng if 隐藏 ng Repeat

javascript - FF 30.0 使用 Selenium IDE 2.5.0 填充页面时出现 NS_ERROR_XPC_SECURITY_MANAGER_VETO 错误

webdriver-io - 无法添加自定义命令

javascript - 如何在 webdriverio 中使用 socks 认证