如何在测试的后期重用生成的值



>上下文:我在第 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')时记录到命令日志等(。

因此,在您的第二个示例中:

  1. 你声明page1value.
  2. 然后立即将命令排队cy.get()cy.invokecy.then()
  3. 并且您还会立即排队cy.log,您传递到page1value(此时仍然是undefined(。
  4. 所有命令排队后,它们开始从上到下执行。当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 调用中使用变量作为参数
  • 在赛普拉斯中,何时使用自定义命令与任务?

相关内容

  • 没有找到相关文章

最新更新