Javascript 如何在以后的测试中重用产生的价值
上下文:我在第1页有一个innerText元素,在第2页有另一个innerText元素。我需要在第3页比较这两个值。所以我需要找到一种方法将这些值全局保存在变量中,以便以后使用 我尝试过的事情: 试用版1:不起作用,因为page1value范围仅限于cy.get() 试用版2:不起作用,因为每当我尝试在外部打印值时,它都是未定义的值或初始化时使用的值Javascript 如何在以后的测试中重用产生的价值,javascript,global-variables,ui-automation,cypress,e2e-testing,Javascript,Global Variables,Ui Automation,Cypress,E2e Testing,上下文:我在第1页有一个innerText元素,在第2页有另一个innerText元素。我需要在第3页比较这两个值。所以我需要找到一种方法将这些值全局保存在变量中,以便以后使用 我尝试过的事情: 试用版1:不起作用,因为page1value范围仅限于cy.get() 试用版2:不起作用,因为每当我尝试在外部打印值时,它都是未定义的值或初始化时使用的值 it('TC Name', () => { let page1value, cy.get('#selector')
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()
也将异步执行,但在将命令推送到队列时(在调用传递给it()
的回调时——在测试开始时),会同步传递/计算传递给它的值(page1value
)
这只是常规的JavaScript行为,与Cypress无关。所有命令cy.*
都只是cy
对象上的方法(函数),它们会立即被调用。不立即调用(执行)的是每个命令的逻辑(例如,在DOM中查询您提供给cy.get()
、调用cy.log('string')
时记录到命令日志的选择器等)
因此,在您的第二个示例中:
page1value
cy.get()
,cy.invoke
,cy.then()
排入队列cy.log
排入队列,并向其传递page1value
(此时仍未定义
)cy.then
命令轮流执行时,会分配page1value
变量,但在测试的其余部分,它不再在任何地方使用(读取)(回想一下,在上一步将它传递给cy.log
命令时,您已经读取了它)cy.get('#selector').invoke('text').then(text => {
cy.log(text);
});
在第三个示例中,如果您对某个对象进行了别名,则需要使用另一个命令访问该值(请记住,所有内容都是异步的,因此您无法访问以同步方式异步设置的值),在本例中,cy.get('@aliasName')
:
注意,为了简单起见,上面的解释有点不准确,而且用之不竭(有更多的事情发生在幕后)。但作为一个如何工作的介绍,他们应该这样做
不管怎样,你一定要读书
您还可以看看我以前的答案,这些答案涉及相关概念:
cy.log()
也将异步执行,但在将命令推送到队列时(在调用传递给it()
的回调时——在测试开始时),会同步传递/计算传递给它的值(page1value
)
这只是常规的JavaScript行为,与Cypress无关。所有命令cy.*
都只是cy
对象上的方法(函数),它们会立即被调用。不立即调用(执行)的是每个命令的逻辑(例如,在DOM中查询您提供给cy.get()
、调用cy.log('string')
时记录到命令日志的选择器等)
因此,在您的第二个示例中:
page1value
cy.get()
,cy.invoke
,cy.then()
排入队列cy.log
排入队列,并向其传递page1value
(此时仍未定义
)cy.then
命令轮流执行时,会分配page1value
变量,但在测试的其余部分,它不再在任何地方使用(读取)(回想一下,在上一步将它传递给cy.log
命令时,您已经读取了它)cy.get('#selector').invoke('text').then(text => {
cy.log(text);
});
在第三个示例中,如果您对某个对象进行了别名,则需要使用另一个命令访问该值(请记住,所有内容都是异步的,因此您无法访问以同步方式异步设置的值),在本例中,cy.get('@aliasName')
:
注意,为了简单起见,上面的解释有点不准确,而且用之不竭(有更多的事情发生在幕后)。但作为一个如何工作的介绍,他们应该这样做
不管怎样,你一定要读书
您还可以看看我以前的答案,这些答案涉及相关概念:
get
之后调用cy.log()
,当然必须记录undefined
。请看看答案是否符合你的需要。如果您只想比较这两个值,那么可以将expect(val1).to.eq(val2)
写入他应该回调中。Cypress命令是异步执行的。您不知道page1value将在何时显示
cy.get('#selector').invoke('text').as('page1value');
cy.get('@page1value').then( value => {
cy.log(value);
});