小编典典

收到错误:等待量角器与页面同步时出错:{}

angularjs

我的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 ====

我究竟做错了什么??


阅读 215

收藏
2020-07-04

共1个答案

小编典典

(非常简短的版本): 使用browser.driver.get代替browser.get

较长的版本: Protractor基本上是Selenium及其Javascript
WebDriver代码的包装。量角器添加代码以等待Angular“安顿下来”(即完成$
digest循环),然后继续测试代码。但是,如果您的页面上没有Angular,则量角器将“永远”(实际上直到超时)等待Angular解决。

browserProtractor暴露给您的测试的对象是Protractor的一个实例(即,如果您在Stack
Overflow上看到带有的旧答案var ptor = protractor.getInstance(); ptor.doSomething(),则可以在那些旧答案中替换ptorbrowser)。量角器还将封装的Selenium WebDriver
API公开为browser.driver。因此,如果调用browser.get,则使用的是Protractor(它将等待Angular稳定下来),但是如果调用browser.driver.get,则使用的是Selenium(不了解Angular)。

在大多数情况下,您将测试Angular页面,因此您将希望使用它browser.get来获得Protractor的好处。但是,如果您的登录页面根本不使用Angular,则应该使用browser.driver.get而不是browser.get用于测试登录页面的测试。请注意,在其余测试中,您还需要使用Selenium
API而不是Protractor API:例如,如果您的HTML输入元素在页面中某处具有id =“
username”,使用browser.driver.findElement(by.id('username'))而不是进行访问element(by.model('username'))

有关更多示例,请参见Protractor测试套件中的示例(或者如果以前的示例不存在,请尝试此链接)。另请参阅量角器文档,其中指出:

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

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

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语法错误。您可能希望在盲目复制和粘贴之前检查其语法。但是,我
信心逻辑,因为这几乎是从我的测试非Angular登录页面的Javascript代码中逐字复制并粘贴的。)

2020-07-04