Я использую 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 из-за недостаточной информации)
@AlexIzbas Я добавил 1000 к ожиданию, и посмотрим, каким будет результат.
@AlexIzbas это сработало! Cypress просто нужно было немного больше времени на эти утверждения. Не стесняйтесь публиковать это как ответ, и я отмечу его для вас. Спасибо !
Рад, что это сработало @wood. Я просто скопировал комментарий в ответы
Это может произойти из-за того, что кипарис скорости работает в средах 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
до проверки их текста на «Выход».
Это может произойти из-за того, что кипарис скорости работает в средах CI, поэтому компонент может не отображаться или событие не может быть прикреплено во время утверждения. Чтобы подтвердить это, вы можете использовать некоторые статические
wait
или создать дополнительные утверждения с помощьюshould
для.navbar-end
идентификатора:cy.get('.navbar-burger').click(); cy.wait(2000);