В этом примере на веб-сайте говорится, что есть простой способ использовать данные, которые вы создаете в 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, которое уже существует. Пожалуйста, предоставьте минимально воспроизводимый пример.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


На самом деле это зависит от способа получения $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') }