提问人:Venkata 提问时间:8/12/2018 最后编辑:Joshua WadeVenkata 更新时间:8/13/2018 访问量:1075
Cypress 不等待 Before 块完成
Cypress not waiting for Before block to complete
问:
我正在尝试实现以下功能
块前:调用 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);
});
})
}
当我尝试执行代码时,我在赛普拉斯中出现以下错误
但是 UI 中存在的元素
问题:
- 为什么我会收到错误
- 如何调用多个异步函数 在块之前
- 如何告诉柏树等到功能开启 在块被处理之前,这意味着不仅要等到收到 响应,但要等到响应在 THEN 块中得到处理
答:
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();
评论
cy.get('.c-header-listItem > .c-link').contains("My Account").click();
对我来说看起来不错。cy.get...
before()
done()
cy.route('SOME URL').as('getPostResponse'); cy.visit(...); cy.wait('@getPostResponse');