cy.wait(20 * 1000);
cy.getAllByTestId('test-field-one')
.first()
.within(() => cy.getByTestId('test-field-two'))
.should('contain', 'test');
Run Code Online (Sandbox Code Playgroud)
我目前正在使用上面的代码,但我不喜欢等待。我更喜欢超时值。有谁知道这在柏树中是否可能?
我想断言我的response.body 是否不包含某些提供的值。假设身体有 10 个物体。所有对象都有“id”字段。如何在请求响应上使用某种each或forEach?我知道我可以使用例如
expect(response.body[0].requestId).not.eq(value);
expect(response.body[1].requestId).not.eq(value);
expect(response.body[2].requestId).not.eq(value);
expect(response.body[3].requestId).not.eq(value);
Run Code Online (Sandbox Code Playgroud)
但我不知道如何以更优化的方式对其进行编码。
我用以下方法准备了数组:
const bodyObjects = [
'body[0]',
'body[1]',
'body[2]',
'body[3]',
'body[4]',
];
Run Code Online (Sandbox Code Playgroud)
我的代码
it.only("Something "A" should not see something "B"", () => {
const bodyObjects = [
'body[0]',
'body[1]',
'body[2]',
'body[3]',
'body[4]',
];
cy.request({
method: "POST",
url: Cypress.env("URL",
auth: {
bearer: token,
},
body: {
id: someId,
},
}).then((response, $bodyObjects) => {
responseId = response.body.id;
expect(response.status).to.eq(201);
**MY POTENTIAL ASSERTION**
})
});
Run Code Online (Sandbox Code Playgroud) 我已经在 Cypress 中看到了可用的钩子,但我想要的是在执行任何规范之前运行一段代码/函数。如何在赛普拉斯中实现这一目标?类似 onPrepare() 之类的东西。使用 9.5.4 版本和旧配置文件。
我制作的 bash 脚本遇到了问题。对于上下文,我编写了 NPM 脚本来在命令行上运行 Cypress 测试。我的目标是拥有一个 bash 脚本来运行每个 NPM 脚本,并在命令行中执行 Cypress。另外供参考,我的 script.sh 位于项目文件夹中。
如果我从终端手动运行 NPM 脚本,就没有问题。赛普拉斯有效。这是我拥有的 NPM 脚本的示例:
"cypress:window": "./node_modules/.bin/cypress open",
Run Code Online (Sandbox Code Playgroud)
问题是当我将这些命令放入 bash 脚本中时。现在,当 script.sh 运行时,它以 code=1 执行,并且实际上根本不运行 Cypress。我的 script.sh 只是:
npm run cypress:window
Run Code Online (Sandbox Code Playgroud) 我希望在这种情况下进行条件测试,表可能存在或不存在:
if (cy.get(#grid).should('not.exist')) {
//do something
} else {
//so something else
}
Run Code Online (Sandbox Code Playgroud)
但似乎不建议进行条件测试?有什么建议吗?
我得到的错误是:
您的配置文件无效:
/Users/mic/Desktop/Projects/MCAT/client/cypress.config.ts
我只是想将 cypress 安装到我的项目中,但从一开始就遇到了这个问题。我尝试过删除并重新安装包文件。我还尝试以多种方式操作 tsconfig.json。


我刚刚开始开发一个新的测试项目,为 ExtJS 应用程序添加 Cypress 测试。ExtJS 使用动态 ID,因此我们使用不同的选择器来识别元素。
\n现在,如果我使用简单的 Javascript,我可以获取 poperties 并调用所选元素的方法,如下所示:
\nele = document.getElementById(\'tdscombo-1108\')\n<div class=\xe2\x80\x8b"x-field x-form-item x-form-item-default x-form-type-text x-field-default x-anchor-form-item" role=\xe2\x80\x8b"presentation" id=\xe2\x80\x8b"tdscombo-1108" data-cy=\xe2\x80\x8b"broadcast_type" style=\xe2\x80\x8b"width:\xe2\x80\x8b 625px;\xe2\x80\x8b">\xe2\x80\x8b\xe2\x80\xa6\xe2\x80\x8b</div>\xe2\x80\x8b\n\nele.id\n\'tdscombo-1108\'\n\nele.role\n\'presentation\'\n\nele.style\nCSSStyleDeclaration\xc2\xa0{0: \'width\', accentColor: \'\', additiveSymbols: \'\', alignContent: \'\', alignItems: \'\', alignSelf: \'\',\xc2\xa0\xe2\x80\xa6}`\n\nele.getAttribute(\'data-cy\')\n\'broadcast_type\'\nRun Code Online (Sandbox Code Playgroud)\n当使用 Cypress 并使用 cy.get 执行相同操作时,\n cy.get(\'[data-cy="broadcast_type"]\').invoke(\'attr\',\'data-cy\')\n和\n cy.get(\'[data-cy="broadcast_type"]\').its(\'data-cy\')\n都返回 Cypress $Chainer 对象。我不知道那是什么。
我最接近的是跑步\n cy.get(\'[data-cy="broadcast_type"]\').then((elem) => {Object.values(elem[0].attributes).forEach((v) => {console.log(v)})});\n这给了我
class=\xe2\x80\x8b"x-field x-form-item x-form-item-default x-form-type-text x-field-default x-anchor-form-item x-field-focus"\nrole=\xe2\x80\x8b"presentation"\nid=\xe2\x80\x8b"tdscombo-1225"\ndata-cy=\xe2\x80\x8b"broadcast_type"\nstyle=\xe2\x80\x8b"width:\xe2\x80\x8b 625px;\xe2\x80\x8b"\nRun Code Online (Sandbox Code Playgroud)\n这些似乎都是某种对象,我无法访问如下属性:v.id。它说undefined.\n我只是希望能够像上面简单的 Javascript 中那样以键值对的形式访问这些属性。
我有一个组件每 20 秒调用 api(setInterval)
我想测试 api 如果返回不同的结果,我的组件会显示什么。
cy.clock我尝试使用和加速 setInterval cy.tick,但它仅在第一次测试中有效。
这是我的代码:
// test.cy.ts
before(()=>{
cy.clock(0,['setInterval'])
cy.visit('my component url')
})
describe('test clock',()=>{
it('test1',()=>{
cy.tick(20000) // work
// call API successfully
})
it('test2',()=>{
cy.tick(20000) // error, you need to call cy.clock before calling cy.tick
})
})
Run Code Online (Sandbox Code Playgroud)
我尝试在调用之前在“test2”中添加 cy.clock cy.tick(20000),没有错误,但仍然无法正常工作。(我不知道为什么,但 API 没有被调用)
我在这里尝试答案: cy.clock and cy.tick not work with split code
但出现错误:无法读取 null 的属性(读取“详细信息”)
我想知道这是因为 Cypress 会restore在测试之间自动调用。
时钟需要在 setInterval 之前调用,这可能是我添加新时钟但不起作用的原因。
有没有什么方法可以使用相同的时钟功能而无需再次访问该页面?
编辑:
我已经尝试了下面的两个答案但仍然不起作用
时钟停在 1000 并且不会更改为 2000
我正在使用 …
我对 Cypress 异步行为存在以下问题。我需要创建一个函数方法,该方法将从 URL 中获取参数并返回它,因为稍后它将在不同的地方使用
所以该方法将如下所示:
getParameterFromUrl(): string {
cy.url().then(url => {
cy.log(url);
const parameterFromUrl = url.match(/\d+$/)[0];
cy.log(paramterFromUrl);
// return parameterFromUrl I know this doesnt work because is within a then
}
}
Run Code Online (Sandbox Code Playgroud)
然后在测试的很多部分我将需要获取这个参数并使用它:
const parameter = onMyPageObject.getParameterFromUrl();
cy.log(parameter)
Run Code Online (Sandbox Code Playgroud)
我当然知道这是未定义的。我已经检查了很多可能的解决方案,但任何解决方案都说服了我,因为我必须用 then 外部来解释到处的代码,并在各处匹配正则表达式(我根本不喜欢这一点)。等待只适用于请求,所以我什至可以使用它。
在这种情况下,我可以做什么来改变异步行为以完成像这样简单的事情?
我有一个自定义命令来从 SQL Server 获取用户数据,效果很好。但现在我找不到循环返回数据的方法。
我需要这样的东西:
var users = []
describe('start tests ', () => {
before(() => {
cy.getUser(1, 0).then(value => {
users.push(value)
});
})
users.forEach((u) => {
it("Test for user " + u['username'], () => {
// test script here
});
});
})
Run Code Online (Sandbox Code Playgroud)
但它不起作用,因为 JavaScriptforEach部分没有等待cy.before(). 我尝试并搜索但找不到解决方案。有任何想法吗?谢谢。