В этом примере на веб-сайте говорится, что есть простой способ использовать данные, которые вы создаете в before() или beforeEach(), в тестовом примере it(). Но когда я попробовал, он сказал, что моя переменная this.variable не определена. После небольшого поиска я обнаружил, что все псевдонимы очищаются перед каждым тестом, что делает пример на веб-сайте невозможным.
Пример на веб-сайте в разделе «Общий доступ»:
describe('parent', () => {
beforeEach(() => {
cy.wrap('one').as('a')
})
context('child', () => {
beforeEach(() => {
cy.wrap('two').as('b')
})
describe('grandchild', () => {
beforeEach(() => {
cy.wrap('three').as('c')
})
it('can access all aliases as properties', function () {
expect(this.a).to.eq('one') // true
expect(this.b).to.eq('two') // true
expect(this.c).to.eq('three') // true
})
})
})
})
Кратко, что я пытаюсь сделать (я думал, способ получения данных не имеет отношения к вопросу):
describe('myTests', () => {
beforeEach(() => {
// producing data resulting in a jquery list element
cy.wrap($element).as('element')
})
it('firstTest', function () {
this.element.click()
})
}
В результате получается TypeError (void 0) is undefined
с ошибкой в начале этого
редактировать:
Итак, я получаю элемент списка с веб-сайта. Второй видимый элемент в главном меню.
describe('Click test', () => {
beforeEach(() => {
let counter = 0
cy.visit('https://www.qalybr.nl')
cy.get('ul[class~=menu] li').each(($el) => {
if ($el.is(':visible')) {
if (counter === 1) {
cy.wrap($el).as('werkenBij')
}
counter++;
}
})
})
it('Werken', () => {
this.werkenBij.click()
})
})
Он правильно оборачивает и присваивает псевдоним элементу, кипарисовый бегун показывает это, но затем не может его найти.
Возможно, вы захотите использовать альтернативный псевдоним, поскольку element
может мешать свойству this
, которое уже существует. Пожалуйста, предоставьте минимально воспроизводимый пример.
На самом деле это зависит от способа получения $element
. Если вы будете следовать схеме, изложенной в приведенных вами документах, проблем не будет.
Это проходит
beforeEach(() => {
cy.get'some-selector-for-button').as('element')
})
it('uses element alias', function() {
this.element.click()
})
и это, конечно, проходит
beforeEach(() => {
cy.get'some-selector-for-button').as('element')
})
it('uses element alias', function() {
cy.get('@element').click()
})
Cypress сообщает вам (на связанной странице), что вам не следует использовать возвращаемое значение запроса, поскольку оно может устареть.
Так что не делай этого
// BAD CODE
beforeEach(() => {
const $element = cy.get'some-selector-for-button')
cy.wrap($element).as('element')
})
it('uses element alias', function() {
this.element.click()
})
Вместо этого всегда связывайте псевдонимы, даже если вы работаете с $element
внутри then()
.
// GOOD CODE
beforeEach(() => {
cy.get'some-selector-for-button')
.then($element => {
const $elementText = $element.text()
// use the text in some way
return $element // return the element for capturing in the alias
})
.as('element')
})
it('uses element alias', function() {
this.element.click()
})
Полный пример в разделе редактирования отличается от примера, приведенного выше.
Чтобы использовать форму псевдонима this.werkenBij
, у вас должен быть обратный вызов на основе function()
, а не обратный вызов на основе функции стрелки.
it('Werken', function() {
this.werkenBij.click()
})
Как вы определяете $element? в документе говорится: cy.get('<имя элемента>').then(($element) => { cy.wrap($element).as('element') }