Почему элемент DOM обнаруживается локально без браузера, но не обнаруживается при запуске в CI?

Я использую Cypress для автоматического тестирования.

Я имею дело с этим куском кода, на котором тесты проходят локально с и без браузере, но не работает в GitLab CI.

HTML:

import React from 'react';
import { Link } from 'react-router-dom';


const NavBar = props => (

        <nav className = "navbar is-dark" role = "navigation" aria-label = "main navigation">
          <div className = "navbar-brand">
            <strong className = "navbar-item">
              { props.title }</strong>
              <span className = "nav-toggle navbar-burger" onClick = {() => {
                  let toggle = document.querySelector('.nav-toggle');
                  let menu = document.querySelector('.navbar-menu');
                  toggle.classList.toggle('is-active');
                  menu.classList.toggle('is-active');
                }}>
              <span aria-hidden = "true"></span>
              <span aria-hidden = "true"></span>
              <span aria-hidden = "true"></span>
          </span>
        </div>
            <div className = "navbar-menu">
              <div className = "navbar-start">
                <Link to = "/" className = "navbar-item">Home</Link>
                {props.isAuthenticated && <Link to = "/about" className = "navbar-item">About</Link>}
                {props.isAuthenticated && <Link to = "/status" className = "navbar-item">User Status</Link>}
              </div>

            <div className = "navbar-end">
              {!props.isAuthenticated && <Link to = "/register" className = "navbar-item" onClick = {props.onClearForm}>Register</Link>}
              {!props.isAuthenticated && <Link to = "/login" className = "navbar-item" onClick = {props.onClearForm}>Login</Link>}
              {props.isAuthenticated && <Link to = "/logout" className = "navbar-item">Logout</Link>}
            </div>
          </div>
        </nav>
    )


export default NavBar;

файл спецификации:

const string = require('randomstring');
const username = string.generate();
const email = `${username}@mail.com`;

describe('Login', () => {
  it('should display the login form', () => {
    cy.visit('/login')
    .get('h1').contains('Login')
    .get('form');
  });
  it('should allow user to register', () => {
    cy.visit('/register')
    .get('input[name = "username"]').type(username)
    .get('input[name = "email"]').type(email)
    .get('input[name = "password"]').type('hakunamatata')
    .get('input[type = "submit"]').click()

    cy.get('.navbar-burger').click();
    cy.get('.navbar-end').within(() => {
      cy
      .get('.navbar-item').contains('Logout').click();

    });
  });
  it('should allow user to login', () => {
    cy.visit('/login')
    .get('input[name = "email"]').type(email)
    .get('input[name = "password"]').type('hakunamatata')
    .get('input[type = "submit"]').click()

    cy.wait(100)
    cy.contains('All Users');
    cy.get('.navbar-burger').click();
    cy.get('.navbar-end').within(() => {
      cy
      .get('.navbar-item').contains('Logout').click();

    });
  });

})

вывод ошибки из CI runner:

AssertionError: Timed out retrying: Expected to find content: 'Logout' within the element: [ <a.navbar-item>, 1 more... ] but never did.
      at Context.eval (http://nginx/__cypress/tests?p=cypress/integration/login.spec.js:37398:30)

Любая помощь очень ценится.

Кипарис версии 6.0.0

(этот текст здесь предназначен для обхода триггера SO из-за недостаточной информации)

Это может произойти из-за того, что кипарис скорости работает в средах CI, поэтому компонент может не отображаться или событие не может быть прикреплено во время утверждения. Чтобы подтвердить это, вы можете использовать некоторые статические wait или создать дополнительные утверждения с помощью should для .navbar-end идентификатора: cy.get('.navbar-burger').click(); cy.wait(2000);

Alex Izbas 14.12.2020 19:55

@AlexIzbas Я добавил 1000 к ожиданию, и посмотрим, каким будет результат.

wood 14.12.2020 20:10

@AlexIzbas это сработало! Cypress просто нужно было немного больше времени на эти утверждения. Не стесняйтесь публиковать это как ответ, и я отмечу его для вас. Спасибо !

wood 14.12.2020 20:30

Рад, что это сработало @wood. Я просто скопировал комментарий в ответы

Alex Izbas 15.12.2020 22:03
Поведение ключевого слова "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) для оценки ваших знаний,...
0
4
244
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это может произойти из-за того, что кипарис скорости работает в средах CI, поэтому компонент может не отображаться или событие не может быть прикреплено во время утверждения.

Чтобы подтвердить это, вы можете использовать некоторые статические wait или создать дополнительные утверждения с помощью should для идентификатора .navbar-end:

cy.get('.navbar-burger').click(); 
cy.wait(2000);
...

P.S. не злоупотребляйте командами wait, так как это антипаттерн. Всегда есть лучшие способы выразить это в Cypress;)

cy.wait() здесь не нужен.

Проблема в том, как используется contains().

cy.get('.navbar-item').contains('Logout')

не ждет текста «Выход».

Вы должны использовать формат

cy.contains('.navbar-item', 'Logout')

который будет повторять все, от чтения всех navbar-items до проверки их текста на «Выход».

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