Angularjs 获取错误:等待量角器与页面同步时出错:{}

Angularjs 获取错误:等待量角器与页面同步时出错:{},angularjs,protractor,angularjs-e2e,Angularjs,Protractor,Angularjs E2e,我的e2e.conf.coffee文件是: exports.config = baseUrl: 'http://localhost:9001' specs: [ 'e2e/**/*.coffee' ] framework: 'jasmine' 我让我的节点项目在端口9001上运行和侦听 我的测试是: describe 'Happy Path', -> it 'should show the login page', -> console.log

我的
e2e.conf.coffee
文件是:

exports.config =
  baseUrl: 'http://localhost:9001'
  specs: [
    'e2e/**/*.coffee'
  ]

  framework: 'jasmine'
我让我的节点项目在端口9001上运行和侦听

我的测试是:

describe 'Happy Path', ->
  it 'should show the login page', ->
    console.log browser

    expect(browser.getLocationAbsUrl()).toMatch("/view1");
  it 'should fail to login', ->
    setTimeout ->
      console.log "FAIL!"
    , 1200
我得到的错误是:

Failures:

  1) Happy Path should show the login page
   Message:
     Error: Error while waiting for Protractor to sync with the page: {}
   Stacktrace:
     Error: Error while waiting for Protractor to sync with the page: {}
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>
==== async task ====
WebDriver.executeScript()
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>
==== async task ====
Asynchronous test function: it("should show the login page")
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>
    at <anonymous>==== async task ====
故障:
1) 快乐路径应该显示登录页面
信息:
错误:等待量角器与页面同步时出错:{}
堆栈跟踪:
错误:等待量角器与页面同步时出错:{}
在
在
在
在
在
在
在
在
在
在
在
在
在
==异步任务====
WebDriver.executeScript()
在
在
在
在
在
在
在
在
在
在
在
==异步任务====
异步测试功能:它(“应该显示登录页面”)
在
在
在
在
在
在
at==异步任务====
我做错了什么

非常短的版本:使用
browser.driver.get
而不是
browser.get

较长的版本:量角器基本上是围绕Selenium及其Javascript Web驱动程序代码的包装器。量角器添加代码,等待Angular“稳定下来”(即完成$digest循环),然后再继续测试代码。然而,若你们的页面上并没有角度,那个么量角器将“永远”等待(实际上只是直到它超时)等待角度稳定下来


量角器向您的测试公开的
browser
对象是量角器的一个实例(即,如果您在堆栈溢出上看到使用
var ptor=dragrator.getInstance();ptor.doSomething()
的旧答案,那么您可以在这些旧答案中用
browser
替换
ptor
)。量角器还将包装好的Selenium WebDriver API公开为
browser.driver
。因此,如果您调用
browser.get
,您使用的是量角器(它将等待Angular稳定下来),但如果您调用
browser.driver.get
,您使用的是Selenium(它不知道Angular)

大多数情况下,您将测试角度页面,因此您需要使用
browser.get
获得量角器的好处。但是如果您的登录页面根本不使用Angular,那么您应该在测试登录页面的测试中使用
browser.driver.get
而不是
browser.get
。请注意,在测试的其余部分中,您还需要使用Selenium API而不是量角器API:例如,如果您的页面中某处有一个id为“username”的HTML输入元素,您将希望使用
browser.driver.findelelement(by.id('username'))
而不是
元素(by.model('username'))

有关更多示例,请参见量角器测试套件中的内容(如果前一个测试套件消失,请尝试)。另请参见哪个州:

量角器在页面上找不到角度库时将失败。如果测试需要与非角度页面交互,请直接使用
browser.driver
访问webdriver实例

示例代码:在上面的登录测试中,您需要执行以下操作:

describe 'Logging in', ->
  it 'should show the login page', ->
    browser.driver.get "http://my.site/login.html"
    // Wait for a specific element to appear before moving on
    browser.driver.wait ->
      browser.driver.isElementPresent(by.id("username"))
    , 1200
    expect(browser.driver.getCurrentUrl()).toMatch("/login.html");
  it 'should login', ->
    // We're still on the login page after running the previous test
    browser.driver.findElement(by.id("username")).sendKeys("some_username")
    browser.driver.findElement(by.id("password")).sendKeys("some_password")
    browser.driver.findElement(by.xpath('//input[@type="submit"]')).click()

(注意:我没有做太多的CoffeeScript,完全有可能我在上面的代码中犯了一个CoffeeScript语法错误。在盲目复制和粘贴它之前,你可能想检查它的语法。但是,我对逻辑很有信心,因为这几乎是从我测试非角度登录的Javascript代码中逐字复制和粘贴的第页。)

如果您需要使用browser.get并收到此错误, 问题很可能是量角器配置文件中的rootElement属性

默认情况下,量角器假定ng app声明位于BODY元素上。但是,在我们的示例中,它可以在DOM中的其他位置声明。因此,我们必须将该元素的选择器分配给rootElement属性:

// rootElement: 'body', // default, but does not work in my case
rootElement: '.my-app', // or whatever selector the ng-app element has
对应的HTML:

<div ng-app="myApp" class="my-app">


我从

中复制了答案,我也遇到了这个错误,但在我的情况下,我的测试正在运行,这个错误是在扩展测试后发生的

如果您尝试在描述块中而不是在测试用例中调用getText(),则可能会发生此错误。我的设置如下所示:

describe('Test Edit Functionality', function() {
    var testEntry = $$('.list-entry').first(),
        testEntryOldName = testEntry.getText();

   it('Should keep old name if edit is aborted', [...]);
});
这导致在等待量角器与页面同步时出现错误:{}

我通过将分配移动到一个beforeach块来修复它

describe('Test Delete Functionality', function() {
    var testEntry = $$('.list-entry').first(),
        testEntryOldName;

   beforeEach(function() {
        testEntryOldName = testEntry.getText();
   });
});

或者,更好的办法是,在您需要这个值的特定测试用例中分配它(如果您不需要它)。

不确定我从哪里得到了这个答案,但这对我来说是有效的:

  • class='ng-app'
    添加到包含应用程序的元素中
  • 使用
    browser.driver.get
    而不是
    browser.get

  • 几天前,我在CT上发现了这个问题。我的测试在3天前一直运行良好,但随后出现了量角器同步错误,并且不会因为此处和处提供的任何解决方案/黑客而消失


    我检查过,这个问题只发生在Firefox headless上,在Chrome headless上运行良好。从Firefox v69升级到最新版本(目前为v72)修复了这个问题。我不知道为什么这个问题开始出现,以及它是如何通过升级得到修复的,但出于价值考虑,我认为这些信息可能会对其他人有用。

    这个问题在stackoverflow上被问了好几次。只需将它复制并粘贴到谷歌搜索中……我做到了——答案没有给我任何指导在你的项目设置上增加一点。如果你的登录页面有角度,你就需要这样做。如果没有角度,也会有例外(我必须再次搜索它们,只是在阅读时扫了一眼…现在时间不多,明天会回头看)祝你好运!那么我如何使用
    waitForAngular
    ?var ptor=graptor.getInstance();ptor.waitForAngular();仍然很忙,这个周末没有太多时间。希望我能帮点忙,威尔
    <div ng-app="myApp" ng-controller="myController" class="ng-app"></div>
    
    exports.config = {
      specs: ['your-spec.js'],
      rootElement: ".ng-app"
    };
    
    describe('foobar element', function() {
      it('should be "baz" after view is initialized', function() {
      browser.driver.get('http://localhost/view');
    
        var inputBox = $('input[name=foobar]');
        expect(inputBox.getAttribute('value')).toEqual("baz");
      });
    });