如何在量角器中点击按钮后等待URL加载?

时间:2017-11-09 07:01:56

标签: angular typescript protractor end-to-end

我正在使用角度2项目上的量角器进行端到端测试,我需要测试登录操作。这里的问题是,当单击登录按钮时,expect语句仍然会将登录页面的URL作为主页。如果我等待,那么测试成功。我在文档中的某处读过量角器等待进程自动完成,所以,

  1. 导致此错误的原因是什么?
  2. 如何在不明确使用wait()方法的情况下正确执行操作?
  3. 量角器是否与fakeAsyncasync或至少whenStable相似 测试
  4. 这是我的测试用例

    it("User successfully login",()=>{
        browser.get(browser.baseUrl + '/account/login').then(() => {
            return expect(browser.getCurrentUrl()).toBe(browser.baseUrl +  "/account/login")
        }).then(()=>{
            element(by.tagName('input[type=text]')).sendKeys('username');
            element(by.tagName('input[type=password]')).sendKeys('password');
            element(by.css('button[type=submit]')).click().then(()=>{
                return expect(browser.getCurrentUrl()).toBe(browser.baseUrl + "/home");
            });
    
        });
    });
    

    注意:

    1. 我有避免使用browser.wait()方法的说明。
    2. 登录按钮通过API向后端发送http请求。
    3. 解决方案解决方案[基于Ernst的解决方案]:

      我有点解决了这个问题。我不知道它是否适用于其他场景或者它是否是正确的方法。我添加了

      browser.wait(EC.urlContains(browser.baseUrl + "/account/login"), 10000);
      browser.waitForAngularEnabled(false);
      browser.wait(EC.urlContains(browser.baseUrl + "/home");
      

      在click()事件之后,它现在似乎有效。

1 个答案:

答案 0 :(得分:3)

导致错误的原因是:

click()返回一个承诺,量角器等待解析。当登录请求被发送到服务器而不是加载主页时,可能会解决这个问题。因此,下一步的执行在页面加载之前开始。

为什么不wait()

我不确定,在什么基础上你得到了不使用browser.wait()的指示。很可能你不应该使用browser.sleep()(因为该命令总是过时的),但如果你不想使用browser.wait(),你的开发人员可能不会离开最初打开的Angular页面。

fakeAsyncwhenStable等等:

量角器默认情况下whenStable使用browser.waitForAngular(),只有在你没有关闭browser.waitForAngularEnabled(false)之后才会调用它{...}你只需要切换关闭非角度页面或如果您的开发人员使用即持久的Macrotasks,这将导致超时。

此外,由于Selenium Control Flow可能会在2018年11月(read about here)被弃用,因此async/await可用。 Read this important guide here以及一些further infos from protractor about it here

现在就是你的情况:

在您的情况下,您不需要使用then(),因为您不需要立即解决承诺。 expect()会自动解决您的承诺,因此不需要then()

事实上,Protractor逐行执行所有命令,好像它们都包含在then()中一样,因此它会自动保持执行同步(只要你不使用{{1启动异步任务)在代码中。

所以这里是我对你的代码的建议:

then()

如果您现在获得超时,那么这是一个单独的调试问题。 检查this Protractor site for infos about timeouts并检查this SO-Answer here以了解如何调试超时。