Cypress.$('abc').text() returns 未定义

Cypress.$('abc').text() returns undefined

我正在尝试使用赛普拉斯查找元素的文本。$ 一切都适用于 cy 对象,但 Cypress.$ 产生 undefined

//这个有效

cy.get('abc').eq(0).find('xyz').then(($elm)=>{
                cy.log("$elm="+$elm.text())
            })

//这会产生“未定义”

var elmText = Cypress.$('abc').eq(0).find('xyz').text()
cy.log(elmText)

有人可以帮助解释为什么 Cypress.$ 在这里不起作用吗??

我只能猜测您有一些 cypress 命令必须在查询选择器之前完成。由于 cypress 命令是异步的,因此在执行 jquery 时,您的 UI 状态尚未就绪。 因此,您可以使其与 cypress 命令同步执行,如下所示:

cy.then(() => {
   var elmText = Cypress.$('abc').eq(0).find('xyz').text()
   cy.log(elmText)
})

@MikhailBolotov 是正确的,像 Cypress.$ 这样的同步代码在与命令相同的块中首先运行。

试试这个简单的访问和标题检查。

it('asynchronous commands', () => {
  cy.visit('http://example.com')
    .then(() => console.log('After visit'))

  var elmText = Cypress.$('h1').text()
  cy.log(elmText)
  console.log('At end of test')
})

console.logs的顺序是

  1. 测试结束时
  2. 参观后

除了@MikhailBolotov 的建议,您还可以使用 beforeEach 之类的钩子来分解块并实现您想要的。

beforeEach(() => {
  cy.visit('http://example.com')
    .then(() => console.log('After visit'))
})

it('asynchronous commands', () => {
  var elmText = Cypress.$('h1').text()
  cy.log(elmText)
  console.log('At end of test')
})

console.logs 的顺序现在正确了

  1. 参观后
  2. 测试结束时