Почему Cypress не распознает testid элемента react-datepicker?

#reactjs #cypress #e2e-testing #react-datepicker

#reactjs #cypress #e2e-тестирование #react-datepicker

Вопрос:

Цель

Чтобы заставить Cypress распознавать элемент DatePicker и управлять им.

Проблема

Я не могу заставить Cypress распознавать data-testid элемента DatePicker, и поэтому у меня нет возможности протестировать его E2E.

Ошибка

 Timed out retrying: Expected to find element: [data-testid="edit_dob"], but never found it.
  

Попытки

Я попытался поместить элемент DatePicker внутри элементов input и div в target вместо этого, но они терпят неудачу, как и ожидалось, по другим причинам.

Я также просмотрел документы как для DatePicker, так и для Cypress для упоминания другого и для подобных вопросов здесь.

Код

Приведенный ниже код работает так, как ожидалось, это просто Cypress, который, похоже, несовместим с вводом DatePicker.

   function displayEditDetails() {
    let listOfForms = [];
    for (const detail in details) {
        listOfForms.push(
          <FormGroup controlId={detail} key={`key_edit_${detail}`}>
            <FormLabel>{detail.charAt(0).toUpperCase()   detail.slice(1).replace('_', ' ')}</FormLabel>
            <FormControl
              data-testid={`edit_${detail}`}
              type={detail}
              value={details[detail] || ''}
              onChange={handleDetailsChange}
            />
          </FormGroup>
        )
    }
    listOfForms.push(
      <DatePicker
        data-testid={'edit_dob'}
        selected={dob}
        onChange={setDob}
        maxDate={new Date()}
      />
    );
    return(
      listOfForms
    )
  }
  

Тест

   it('Displays the edit fields', () => {
    cy.get('[data-testid="accountButton"]')
      .click();

    cy.get('[data-testid="editUserDetailsButton"]')
      .click();

    cy.get('[data-testid="user_email"]')
      .should('not.be.visible');

    cy.get('[data-testid="edit_full_name"]')
      .should('be.visible');

    cy.get('[data-testid="edit_dob"]')
      .should('be.visible');

    cy.get('[data-testid="edit_email"]')
      .should('be.visible')
      .should('have.value', 'test@editdetails.com');
  })
  

Как только я смогу настроить таргетинг на него, я планирую протестировать очистку текущего ввода и ввод новой даты. Приветствуется любая помощь, нацеленная на средство выбора, и предупреждения о дальнейших потенциальных ошибках.

Редактировать: вот сгенерированный HTML-код формы.

 <form>
  <div class="form-group">
    <label class="form-label" for="email">Email</label>
    <input data-testid="edit_email" type="email" id="email" class="form-control" value="admin@example.com" style="background-image: url(amp;quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVQ4EaVTO26DQBD1ohQWaS2lg9JybZ AK7hNwx2oIoVf4UPQ0Lj1FdKktevIpel8AKNUkDcWMxpgSaIEaTVv3sx7uztiTdu2s/98DywOw3Dued4Who/M2aIx5lZV1aEsy0 qiwHELyi Ytl0PQ69SxAxkWIA4RMRTdNsKE59juMcuZd6xIAFeZ6fGCdJ8kY4y7KAuTRNGd7jyEBXsdOPE3a0QGPsniOnnYMO67LgSQN9T41F2QGrQRRFCwyzoIF2qyBuKKbcOgPXdVeY9rMWgNsjf9ccYesJhk3f5dYT1HX9gR0LLQR30TnjkUEcx2uIuS4RnI aj6sJR0AM8AaumPaM/rRehyWhXqbFAA9kh3/8/NvHxAYGAsZ/il8IalkCLBfNVAAAAABJRU5ErkJggg==amp;quot;); background-repeat: no-repeat; background-attachment: scroll; background-size: 16px 18px; background-position: 98% 50%; cursor: auto;">
  </div>

  <div class="form-group">
    <label class="form-label" for="full_name">Full name</label>
    <input data-testid="edit_full_name" type="full_name" id="full_name" class="form-control" value="Jareth">
  </div>

  <div class="form-group">
    <label class="form-label" for="address">Address</label>
    <input data-testid="edit_address" type="address" id="address" class="form-control" value="">
  </div>

  <div class="form-group">
    <label class="form-label" for="postcode">Postcode</label>
    <input data-testid="edit_postcode" type="postcode" id="postcode" class="form-control" value="">
  </div>

  <div data-testid="edit_dob">
    <div class="react-datepicker-wrapper">
      <div class="react-datepicker__input-container">
        <input type="text" class="" value="04/03/1999">
      </div>
    </div>
  </div>

  <button data-testid="confirmChangesButton" type="submit" class="LoaderButton  btn btn-primary btn-block">Confirm Changes</button></form>
  

Комментарии:

1. Можете ли вы поделиться сгенерированным HTML-кодом, на который нацелен, пожалуйста?

2. Публикация HTML привела меня на правильный путь. Я только что узнал о игровой площадке Selector, и она работает так, как задумано.

Ответ №1:

Проблема видна при просмотре HTML-кода, созданного при запуске приложения.

DatePicker HTML

   <div data-testid="edit_dob">
    <div class="react-datepicker-wrapper">
      <div class="react-datepicker__input-container">
        <input type="text" class="" value="04/03/1999">
      </div>
    </div>
  </div>
  

DatePicker отображается как элемент ввода внутри нескольких divs, а идентификатор теста не предназначен для ввода.

Решение

API игровой площадки селектора для Cypress предлагает cy.get('.react-datepicker__input-container > input') класс родительского div ввода. С помощью этого я могу настроить таргетинг на DatePicker, очистить его и ввести новый ввод.

Примечания для следующего раза

  1. Изучите HTML
  2. Прочитайте документы более тщательно

Ответ №2:

Обратитесь к концепциям, используемым в cy.pickDateRange команде в приложении Cypress Real World. Это платежное приложение для демонстрации реального использования методов, шаблонов и рабочих процессов тестирования Cypress.

В коде команды вы обнаружите, что необходимо изучить созданный HTML-код и обработать его соответствующим образом для ваших нужд.