我的e2e.conf.coffee档案是:
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 ====
我究竟做错了什么??
(非常简短的版本): 使用browser.driver.get代替browser.get。
browser.driver.get
browser.get
较长的版本: Protractor基本上是Selenium及其Javascript WebDriver代码的包装。量角器添加代码以等待Angular“安顿下来”(即完成$ digest循环),然后继续测试代码。但是,如果您的页面上没有Angular,则量角器将“永远”(实际上直到超时)等待Angular解决。
browserProtractor暴露给您的测试的对象是Protractor的一个实例(即,如果您在Stack Overflow上看到带有的旧答案var ptor = protractor.getInstance(); ptor.doSomething(),则可以在那些旧答案中替换ptor为browser)。量角器还将封装的Selenium WebDriver API公开为browser.driver。因此,如果调用browser.get,则使用的是Protractor(它将等待Angular稳定下来),但是如果调用browser.driver.get,则使用的是Selenium(不了解Angular)。
browser
var ptor = protractor.getInstance(); ptor.doSomething()
ptor
browser.driver
在大多数情况下,您将测试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'))。
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代码中逐字复制并粘贴的。)