Cypress 不等待 Before 块完成

Cypress not waiting for Before block to complete

提问人:Venkata 提问时间:8/12/2018 最后编辑:Joshua WadeVenkata 更新时间:8/13/2018 访问量:1075

问:

我正在尝试实现以下功能

块前:调用 Cy.visit(“/login”) 并调用一个函数,该函数将触发 REST API 并处理 REST API 响应并设置本地存储。

只有在设置了本地存储后,才能点击“我的帐户”链接

这是我正在尝试的源代码。

    import * as subscriberHelpers from '../../../helpers/subscriberHelpers';
    import * as localStorage from '../../../helpers/localStorage';


describe('testCode', () => {
    before((done) => {
        cy.visit('/login', {
            timeout: 10000,
            onLoad: () => {
                localStorage.write("CD-Environment", Cypress.env('defaultEnvironment'));
                localStorage.write("CD-Language", "en-US");
                localStorage.write("CD-SystemId", "85788485-e411-48a9-b478-610c1285dc1a");
            }
        })
        subscriberHelpers.createSubscriber().then(()=>{
            done();
        })

    })

    it('sClick on my account link', () => {
        cy.get('.c-header-listItem > .c-link').contains("My Account").click();
    })
})

下面是 createSubscriber 函数的代码

export function createSubscriber() {

    let URL = `SOME URL`;
    let body = {
       Some Body
    }
    return new Promise((resolve, reject) => {
        request.subscriberServiceRequest(URL, body).then((response) => {
            if (response.status === 200 && ("SessionId" in response.body)) {
                localStorage.write("CD-SessionId", response.body.SessionId);
                localStorage.write("CD-SubscriberId", response.body.Subscriber.Id);
                resolve();
            }
            else if (response.status === 200 && ("Fault" in response.body)) {
                reject(response.body.Fault.Message);
            }
        })
    })
}

这是订阅者服务请求函数的代码

export function subscriberServiceRequest(url, body, headers = null) {
    let defaultHeaders = { "CD-SystemId": "85788485-e411-48a9-b478-610c1285dc1a" }
    if (headers != null) {
        defaultHeaders = addHeaders(defaultHeaders, headers);
    }
    return new Cypress.Promise((resolve, reject) => {
        cy.request({
            url: url,
            method: 'POST',
            body: body,
            headers: defaultHeaders
        }).then((response) => {
            resolve(response);
        });
    })
}

当我尝试执行代码时,我在赛普拉斯中出现以下错误

Console Error Cypress UI

但是 UI 中存在的元素

Element

问题:

  1. 为什么我会收到错误
  2. 如何调用多个异步函数 在块之前
  3. 如何告诉柏树等到功能开启 在块被处理之前,这意味着不仅要等到收到 响应,但要等到响应在 THEN 块中得到处理
承诺 摩卡.js BDD 柏树

评论

0赞 Richard Matsen 8/14/2018
cy.get('.c-header-listItem > .c-link').contains("My Account").click();对我来说看起来不错。
0赞 Richard Matsen 8/14/2018
我认为消息中有一个线索,因为这个错误发生在“之前”钩子期间......,但显然你不打算在.我看不出任何原因(例如缺少右括号)。我认为问题出在使用 - 似乎没有使用 done() 的 Cypress 示例,当我将其添加到我自己的测试中时,它不能很好地播放。cy.get...before()done()
0赞 Richard Matsen 8/14/2018
我建议你试试 See route 命令cy.route('SOME URL').as('getPostResponse'); cy.visit(...); cy.wait('@getPostResponse');

答:

0赞 Joshua Wade 8/13/2018 #1

要回答您的第一个问题:

为什么我会收到错误

.contains()专门搜索其中的元素,但不包括它被调用的标记。换句话说,将不匹配。someElement.contains("My Account")someElement

相反,您应该拥有的是:

cy.get('.c-header-listItem').contains("My Account").click();

或者简单地说:

cy.contains("My Account").click();