javascript - Protractor 排序基本测试。登录后运行测试

标签 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 应用程序。现在我的测试有时会通过。问题是有时它会获取登录页面的标题,有时会获取主页的标题(我希望它在登录后始终测试主页的标题)。

我一直在尝试使用 promise 和浏览器。稍等一下,但还没有真正确定下来。任何建议都会很棒!

最佳答案

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

在您的登录页面中,一旦您login.click(),您的主页需要一些时间来加载,因此遵循异步方法,如 - browser.getCurrentUrl & browser.getTitle 首先被调用。正如您所指出的那样,这种情况不一致。

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

browser.getCurrentUrl 也返回一个你必须解决它的 promise 。

要解决此问题,您应该以正确的方式使用 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');
  });
});

});

此外,由于您的登录页面是非 Angular ,您可以以正确的方式编写测试,即使用 browser.ignoreSynchronization 并以更简洁的方式使用 Protractor api 方法。

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');
  });
});

});

注意不需要访问browser.driver对象,可以直接使用 Protractor 的方法!

关于javascript - Protractor 排序基本测试。登录后运行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41171159/

相关文章:

javascript - HTML 表格 - Javascript 选择和取消选择元素(单元格)

angularjs - 从一个工厂更新另一个工厂的数据

asynchronous - meteor 插入集合似乎工作,但仍然是空的

javascript - 获取jaydata同步返回对象

javascript - 如何将总纳秒转换为 HH :MM:SS:ms:ns in JavaScript and node? 格式的字符串

javascript - 无法使用 ng-click 更改 Angular $scope

c# - 是否可以等待空文字?

asp.net - 我应该将工作卸载到 ASP.NET 中的其他线程吗?

javascript - 所有 jstree 插件都无法正常运行

javascript - 先锚定标签href,然后onclick