Protractor端到端测试登录重定向

17

目前有一个部分端到端测试,输入用户名/密码并点击“登录”。

它成功地完成了这个过程,但是最终停留在“感谢您已登录”的页面,而不是像通过浏览器登录那样重定向到“帐户门户”或“仪表板”。

我在这个项目中是新手,但我们正在使用OAuth。

主要问题:这是否需要进行http模拟?

更多细节:

spec.js

describe('login page', function() {
    browser.driver.get('http://url.path/login');
    it('should render login page', function() {

      // Checking the current url
      var currentUrl = browser.driver.getCurrentUrl();
      expect(currentUrl).toMatch('/login');
    });
    it('should sign in', function() {

      // Find page elements
      var userNameField = browser.driver.findElement(By.id('username'));
      var userPassField = browser.driver.findElement(By.id('password'));
      var userLoginBtn  = browser.driver.findElement(By.id('loginbtn'));

      // Fill input fields
      userNameField.sendKeys('test@user.com');
      userPassField.sendKeys('1234');

      // Ensure fields contain what we've entered
      expect(userNameField.getAttribute('value')).toEqual('test@user.com');
      expect(userPassField.getAttribute('value')).toEqual('1234');

      // Click to sign in - waiting for Angular as it is manually bootstrapped.
      userLoginBtn.click().then(function() {
        browser.waitForAngular();
        expect(browser.driver.getCurrentUrl()).toMatch('/success');
      }, 10000);
    });
});

如果我快速点击测试窗口,我可以看到它成功到达“成功”页面-但它不会重定向到仪表板(当您通过浏览器手动登录时,它会重定向)。我该如何继续这个测试以保持已登录状态并像用户一样访问仪表板?

// 初次接触项目、Angular和Protractor。

编辑-稍微总结一下:

  • 我希望Protractor从/login页面开始测试
  • Protractor应查找并填写用户名和密码字段,然后单击登录
  • Protractor成功登录,看到/thankyou页面,然后立即重定向到用户的/dashboard页面
  • 也许我错过了一个步骤,我们需要在Protractor测试中手动重定向吗?

(当用户通过浏览器手动登录时,他们不会看到/thankyou页面-快速重定向到/dashboard。 Protractor无法到达仪表板页面。)

2个回答

7

您的帖子缺少信息,但我会尝试做出假设:

我怀疑您的“感谢您已登录”页面在超时后进行javascript重定向。

因此,在您单击“登录”之后,浏览器会加载“感谢您已登录”页面,并且由于.then()的第二个参数没有任何作用,browser.waitForAngular()失败,因为该页面上没有angular。

您应该尝试使用类似browser.driver.wait()的东西,并设置合理的超时时间来检测url更改(在此处描述:https://github.com/angular/protractor/issues/610),并在浏览器到达/success页面后触发browser.waitForAngular()


当我运行你提供的页面上的解决方案中的代码时,Protractor会显示:“失败:未定义的函数”。看起来它在“compareCurrentUrl”函数处失败了。我使用该函数的示例可以在此处找到https://jsfiddle.net/s3tbfkwy/ - bruh

2

你尝试过使用显式等待吗?

    return browser.driver.wait(function() {
        return browser.driver.getCurrentUrl().then(function(url) {
            return /success/.test(url);
        });
    }, 10000);

您的代码应该像这样:

您的代码应该像这样:

  // Click to sign in - waiting for Angular as it is manually bootstrapped.
  userLoginBtn.click();
  return browser.driver.wait(function() {
        return browser.driver.getCurrentUrl().then(function(url) {
            return /success/.test(url);
        });
  }, 10000);

这很有帮助,除了返回行应更改为:return url === [期望的URL]; - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接