首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何等待URL加载按钮后点击量角器?

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

Stack Overflow用户
提问于 2017-11-09 07:01:56
回答 1查看 4.6K关注 0票数 4

我正在做一个端到端测试,在一个角2项目中使用量角器,我需要测试一个登录操作。这里的问题是,当单击“登录”按钮时,expect语句仍然会获得登录页的URL,这应该是主页的URL。如果我等着,那么测试就成功了。我在文档中看到了量角器等待过程自动完成的地方,所以,

  1. 是什么导致了这个错误?
  2. 如何在不显式使用wait()方法的情况下正确地执行操作?
  3. 量角器在单元测试中是否有类似于fakeAsyncasync或至少whenStable的东西?

这是我的测试用例

代码语言:javascript
运行
复制
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请求。

基于Ernst的解决方案

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

代码语言:javascript
运行
复制
browser.wait(EC.urlContains(browser.baseUrl + "/account/login"), 10000);
browser.waitForAngularEnabled(false);
browser.wait(EC.urlContains(browser.baseUrl + "/home");

就在click()事件之后,它现在似乎还能工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-09 07:51:38

导致错误的原因:

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

为什么不wait()**:** ?

我不知道,你是从什么基础上得到不使用browser.wait()的指令的。很可能您不应该使用browser.sleep() (因为这个命令总是过时的),但是如果您不想使用browser.wait(),您的开发人员可能一次也不会离开最初打开的角页。

fakeAsync**,** whenStable 等:

量角器默认在whenStable中使用browser.waitForAngular(),它总是在承诺之后调用,只要您不关闭browser.waitForAngularEnabled(false).如果您只需要关闭非角度页面,或者如果开发人员使用持久的宏任务,则会导致超时。

此外,由于Selenium流可能会在2018年11月(在这里读到)被废弃,所以有可用的async/await在这里阅读这个重要的指南。和一些从量角器得到的更多关于它的信息

现在在你的例子中:

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

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

因此,这里我对您的代码的建议:

代码语言:javascript
运行
复制
it("User successfully login",()=>{
    var EC = protractor.ExpectedConditions;  //or within onPrepare() of conf.js put global.EC = protractor.ExpectedConditions ... to make it everywhere available.
    browser.get(browser.baseUrl + '/account/login');
    //next line lets protractor wait max 5 seconds for your url to become, what you want.
    browser.wait(EC.urlContains(browser.baseUrl +  "/account/login"), 5000);
    //additionally after the URL appeared, use this command to wait until the page is fully loaded.
    browser.waitForAngular();
    expect(browser.getCurrentUrl()).toBe(browser.baseUrl +  "/account/login");
    element(by.tagName('input[type=text]')).sendKeys('username');
    element(by.tagName('input[type=password]')).sendKeys('password');
    element(by.css('button[type=submit]')).click();
    //next line lets protractor wait max 5 seconds for your url to become, what you want.
    //as here a new page is loaded and the click()-promise is resolved before, use this:
    browser.wait(EC.urlContains(browser.baseUrl +  "/account/login"), 5000);
    //additionally after the URL appeared, use this command to wait until the page is fully loaded.
    browser.waitForAngular();
    expect(browser.getCurrentUrl()).toBe(browser.baseUrl + "/home");
});

如果您现在有超时,那么这是另一个需要调试的问题。检查这个量角器站点提供关于超时的信息。请回答这个问题以了解如何调试超时。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47195796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档