>上下文:我在第 1 页中有一个带有 innerText 的元素,在第 2 页上有一个带有 innerText 的元素。我需要在第 3 页比较这两个值。所以我需要找到一种方法将这些值全局保存在变量中,以便以后可以使用它们。
我尝试过的事情:
试用 1:不起作用,因为 page1value 范围仅限于 cy.get((
cy.get('#selector').invoke('text').then(text => {
const page1value = text
})
试用 2:不起作用,因为每当我尝试在外面打印值时,它都是未定义的或初始化它时使用的值。
it('TC Name', () => {
let page1value,
cy.get('#selector').invoke('text').then(text => {
page1value = text
})
cy.log(page1value) //comes as undefined
})
试用 3:使用 .as(( 以及它作为未定义出现。
let page1value;
cy.get('#selector').invoke('text').as('page1value');
cy.log(page1value) //comes as undefined
如果有人能告诉我我哪里做错了,那就太好了。
Cypress 命令被推送(排队(到队列(称为命令队列---基本上是一个数组(,然后串行(一个接一个(异步执行。
虽然您的cy.log()
也将异步执行,但在上一个命令之后,您传递给它的值 (page1value
( 在将命令推送到队列时同步传递/评估(在传递给it()
的回调时进行评估,---在测试开始时调用(。
这只是常规的 JavaScript 行为,与 Cypress 无关。cy.*
的所有命令都只是cy
对象上的方法(函数(,它们会立即被调用。没有立即调用(执行(的是每个命令执行的逻辑(例如,在DOM中查询您提供给cy.get()
的选择器,调用cy.log('string')
时记录到命令日志等(。
因此,在您的第二个示例中:
- 你声明
page1value
. - 然后立即将命令排队
cy.get()
、cy.invoke
、cy.then()
。 - 并且您还会立即排队
cy.log
,您传递到page1value
(此时仍然是undefined
(。 - 所有命令排队后,它们开始从上到下执行。当
cy.then
命令轮流执行时,将分配page1value
变量,但在测试的其余部分不再在任何地方使用(读取((回想一下,在上一步中将其传递给cy.log
命令时,您已经读取了它(。
因此,您要做的是:
cy.get('#selector').invoke('text').then(text => {
cy.log(text);
});
在第三个示例中,如果您为某些内容添加别名,则需要使用另一个命令访问该值(请记住,一切都是异步的,因此您无法像现在这样以同步方式访问异步设置的值(,在本例中cy.get('@aliasName')
:
cy.get('#selector').invoke('text').as('page1value');
cy.get('@page1value').then( value => {
cy.log(value);
});
请注意,为了简单起见,上述解释略显不准确且不详尽(幕后还有更多事情发生(。但作为事物如何运作的介绍,他们应该这样做。
无论如何,你绝对应该阅读赛普拉斯简介。
你也可以看看我之前涉及相关概念的答案:
- 如何在赛普拉斯的 API 调用中使用变量作为参数
- 在赛普拉斯中,何时使用自定义命令与任务?