量角器测序基本测试。登录后运行测试

时间:2016-12-15 18:40:06

标签: javascript angularjs asynchronous promise protractor

我试图找出如何使这个基本测试通过一致。

describe('home page', function () {

  beforeEach(function () {
      browser.driver.get('https://localhost:0000/xxxx/');
  });

  it('should have a title', function () {
      var userName = browser.driver.findElement(by.id('userid_inputtext')).sendKeys('userNameXX');
      var passWord = browser.driver.findElement(By.id("password_inputtext")).sendKeys("passWordXX");
      var login = browser.driver.findElement(By.id('sign_in_button'));

      login.click();

      browser.driver.getCurrentUrl();
      browser.driver.getTitle().then(function (title) {
          expect(title).toEqual('Webpage Title');
      });
  });

});

登录页面不是Angular,但登录后会加载Angular应用程序。现在我的测试通过了一些时间。问题是,有时它会获取登录页面的标题,有时它会获取主页的标题(我希望它在登录后始终如一地测试主页的标题)。

我已经玩过使用承诺和浏览器。等一下但是没有真正把它钉死。任何建议都会很棒!

1 个答案:

答案 0 :(得分:2)

我能想到的一些事情 - 量角器API中的大多数方法都是异步的并且返回promise。

browser.getCurrentUrl后的登录页面中,您的主页需要一些时间才能加载,因此请遵循 - browser.getTitle&首先调用browser.getCurrentUrl。如你所指出,这种情况不一致。

此外,您应该将变量分配给元素定位器,然后对它们执行操作!您应该使用页面对象来存储定位器。请参阅Official Protractor Style Guide

browser.wait也会返回您必须解决的承诺。

要解决此问题,您应该以正确的方式使用describe('home page', function () { beforeEach(function () { browser.driver.get('https://localhost:0000/xxxx/'); }); it('should have a title', function () { var userName = browser.driver.findElement(by.id('userid_inputtext')); userName.clear(); userName.sendKeys('userNameXX'); var passWord = browser.driver.findElement(By.id("password_inputtext")); passWord.clear(); passWord.sendKeys("passWordXX"); var login = browser.driver.findElement(By.id('sign_in_button')); browser.driver.wait(login.click(),5000,'homePage should be loaded within 5 secs'); // would throw an error if the page takes more than 5 secs to load // you could also use `browser.driver.sleep(500)` but not advisable as sleeps slow the tests down! browser.driver.getCurrentUrl().then(function (url) { expect(url).toEqual('homePage url'); }); browser.driver.getTitle().then(function (title) { expect(title).toEqual('Webpage Title'); }); }); });

browser.ignoreSynchronization

此外,由于您的登录页面是非角度的,您可以以正确的方式编写测试,即使用describe('home page', function () { beforeEach(function () { browser.get('https://localhost:0000/xxxx/'); }); it('should have a title', function () { browser.ignoreSynchronization = true; // set it to true for non-angular pages(loginPage) var userName = element(by.id('userid_inputtext')); userName.clear(); userName.sendKeys('userNameXX'); var passWord = element(By.id("password_inputtext")); passWord.clear(); passWord.sendKeys("passWordXX"); var login = element(By.id('sign_in_button')); browser.wait(login.click(),5000,'homePage should be loaded within 5 secs'); browser.ignoreSynchronization = false; // set it to false for angular pages(homePage) browser.getCurrentUrl().then(function (url) { expect(url).toEqual('homePage url'); }); browser.getTitle().then(function (title) { expect(title).toEqual('Webpage Title'); }); }); }); 并以更干净的方式使用量角器api方法。

browser.driver

请注意,无需访问kendo.parseDate(date,"yyyy-MM-ddTHH:mm:ss.fffZ")对象,您可以直接使用量角器的方法!