Использование псевдонима из before() в тесте it()

В этом примере на веб-сайте говорится, что есть простой способ использовать данные, которые вы создаете в 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? в документе говорится: cy.get('<имя элемента>').then(($element) => { cy.wrap($element).as('element') }

Burak Ayyildiz 11.07.2024 14:33

Возможно, вы захотите использовать альтернативный псевдоним, поскольку element может мешать свойству this, которое уже существует. Пожалуйста, предоставьте минимально воспроизводимый пример.

Twisty 11.07.2024 17:14
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Другие вопросы по теме