英文:
Javascript cypress test runtime behavior
问题
I think this is a common Javascript question, rather than cypress test, yet I am not sure.
So I have a UI in web, which will show a text message like "found 3234 matches", I would like to use cypress to extract the number 3234, then on the next page, I will input 3234 in another input box.
My code is like
const MATCHING_MESSAGE = '[data-cy=matchingMessages]';
let count = 0;
cy.get(MATCHING_MESSAGE)
.invoke('text')
.then((text) => {
const pattern = /[0-9]+/g;
count = text.match(pattern).pop();
console.log({ count1: count });
})
// move to the next page
console.log({ count2: count });
if (count > 0) {
// input count
} else {
// input a min number like 5
}
However, when I execute this, the browser console is like
log: count2: 0
log: count1: 3234
Then the next page is always behaving like count is 0
.
- 我知道这是执行顺序的问题,但为什么 "count2: 0" 这个日志会这么快执行,甚至在我转到第二页之前就被记录下来了?
- 此外,我缺少哪些有关JS的知识,以更好地理解执行顺序和Promise问题?
- 有办法可以强制执行顺序吗?
谢谢!
英文:
I think this is a common Javascript question, rather than cypress test, yet I am not sure.
So I have a a UI in web, which will show a text message like found 3234 matches
, I would like to use cypress to extract the number 3234, then on next page, I will input 3234 in another input box.
My code is like
const MATCHING_MESSAGE = '[data-cy=matchingMessages]';
let count = 0;
cy.get(MATCHING_MESSAGE)
.invoke('text')
.then((text) => {
const pattern = /[0-9]+/g;
count = text.match(pattern).pop();
console.log({count1: count});
})
// move to next page
console.log({count2: count});
if (count > 0) {
// input count
} else {
// input a min number like 5
}
However, when I execute this. the browser console is like
log: count2: 0
log: count1: 3234
Then the next page is always behaving like count is 0
- I know this is execution order issue, but why log
count2: 0
execute so fast like this get logged even before I moved to the second page. - Also, what knowledge I am missing for JS, to get more of this execution order and promise issue.
- Is there a way I can enforce the execution order?
many thanks
答案1
得分: 2
你可以使用一个cy.then()
命令,将其包装在使用count
的代码周围。
这将确保在使用它之前已经对该值进行了评估。
const MATCHING_MESSAGE = '[data-cy=matchingMessages]';
let count = null; // null不是有效的值,所以如果评估是0或3243,或者实际上没有发生,那么这是显而易见的
// 这个块是Cypress队列代码,所以它将在队列运行时稍后评估
cy.get(MATCHING_MESSAGE)
.invoke('text')
.then((text) => {
const pattern = /[0-9]+/g;
count = text.match(pattern).pop()
console.log({count1: count});
})
// 转到下一页
cy.then(() => {
// 在then()内部:这段代码也在Cypress队列上运行,所以现在您可以获得正确的执行顺序
console.log({count2: count});
// parseInt,因为您要进行数值比较
if (parseInt(count) > 0) {
// 输入计数
} else {
// 输入最小数字,比如5
}
})
页面刷新
执行// 转到下一页
的部分可能会刷新浏览器。如果是这样,count
变量将被完全清除。
如果您发现是这种情况,请将count添加到Cypress环境中。
const MATCHING_MESSAGE = '[data-cy=matchingMessages]';
cy.get(MATCHING_MESSAGE)
.invoke('text')
.then((text) => {
const pattern = /[0-9]+/g;
count = text.match(pattern).pop()
console.log({count1: count});
Cypress.env('count', count) // 保存到环境存储
})
// 转到下一页
cy.then(() => {
// 在then()内部:这段代码也在Cypress队列上运行,所以现在您可以获得正确的执行顺序
cont count = Cypress.env('count') // 恢复值
console.log({count2: count});
// parseInt,因为您要进行数值比较
if (parseInt(count) > 0) {
// 输入计数
} else {
// 输入最小数字,比如5
}
})
英文:
You can use a cy.then()
command as a wrapper around the code that uses count
.
This will make sure the value has been evaluated before using it.
const MATCHING_MESSAGE = '[data-cy=matchingMessages]';
let count = null; // null is not a valid value, so it's obvious if the
// evaluation is 0 or 3243 - or not actually happened
// this block is Cypress queue code, so it will evaluate later when the queue runs
cy.get(MATCHING_MESSAGE)
.invoke('text')
.then((text) => {
const pattern = /[0-9]+/g;
count = text.match(pattern).pop()
console.log({count1: count});
})
// move to next page
cy.then(() => {
// inside then(): this block of code also runs on the Cypress queue
// so now you get the correct ordering of execution
console.log({count2: count});
// parseInt since you do a numeric compare
if (parseInt(count) > 0) {
// input count
} else {
// input a min number like 5
}
})
Page refresh
The part that does // move to next page
may refresh the browser. If so the count
variable will be erased altogether.
If you find that is the case, add the count to the Cypress environment instead.
const MATCHING_MESSAGE = '[data-cy=matchingMessages]';
cy.get(MATCHING_MESSAGE)
.invoke('text')
.then((text) => {
const pattern = /[0-9]+/g;
count = text.match(pattern).pop()
console.log({count1: count});
Cypress.env('count', count) // save to environment store
})
// move to next page
cy.then(() => {
// inside then(): this block of code also runs on the Cypress queue
// so now you get the correct ordering of execution
cont count = Cypress.env('count') // restore the value
console.log({count2: count});
// parseInt since you do a numeric compare
if (parseInt(count) > 0) {
// input count
} else {
// input a min number like 5
}
})
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论