Cypress.io: чтение и сохранение значения ввода формы в переменную JS (или константу) - PullRequest
0 голосов
/ 27 августа 2018

У меня есть HTML-форма (действительно простая, без хитрых частей, таких как Ajax, ...) на простой странице. Я пытаюсь прочитать значение по умолчанию для любого ввода (type = "text", опять же без трюков) и сохранить его в константе для последующего использования (assert).

HTML выглядит так:

<form method="post" ...>
  <input type="text" id="xyz" name="xyz" value="123">
</form>

Cypress-тест, который не работает, выглядит следующим образом:

describe('General tests', function(){

  context('General', function() {

    it('can read the input and store in const', function () {

        cy.visit('http://localhost/settings')
        const xyz = Cypress.$('#xyz').val()
        cy.log(xyz)

    })

  })
})

Это не работает. НО после нескольких часов игры (случайно это сработало для меня в более сложном тестовом наборе = файл). Я понял, что эта конструкция работает должным образом в случае, если предыдущий тест (= it ()) посещает тот же URL, что и последний посещенный URL. Чем это работает как чудо.

Cypress-тест, который работает, выглядит так:

describe('General tests', function(){

  context('General', function() {

    it('makes magic and allows the next test to work', function () {

        cy.visit('http://localhost/settings')

    })

    it('can read the input and store in const', function () {

        cy.visit('http://localhost/settings')
        const xyz = Cypress.$('#xyz').val()
        cy.log(xyz)

    })

  })
})

Я думал, что тесты должны быть независимыми, но похоже, что они не являются.

Я пробовал другие способы получения значения входной информационной переменной и самое близкое, что мне было нужно, это использовать замыкание ".then ()", но его можно использовать только для одного ввода, а не для более сложных форм.

Простое утверждение типа "cy.get ('# id_of_input'). Should ('eq', ...)" работает нормально, но не позволяет мне работать со значением по умолчанию (и переопределенным тестом) значением входы.

Итак, мои вопросы:

1) Можно ли таким образом использовать включенный jQuery для получения и сохранения значения ввода в константе? Если сейчас, что является другим способом для случаев, когда мне нужно сделать это для примерно 5 различных полей ввода в форме (для закрытия ввода сигнала будет просто хорошо) 2) Это нормально, что тесты влияют друг на друга?

Спасибо всем за помощь.

1 Ответ

0 голосов
/ 27 августа 2018

Чтобы ответить на ваши вопросы:


1) Согласно документации, Cypress.$ - это "отличный способ синхронно запроса элементов". (выделение их)

То, как вы его используете, обходит намеченный рабочий процесс Cypress с помощью асинхронной очереди команд. Если вы не знаете, о чем я говорю, я предлагаю прочитать фантастическое введение в Cypress в их документации .

Я бы предложил следующее в качестве альтернативы опубликованному вами коду:

cy.visit('http://localhost/settings');
cy.get('#xyz').then(elem => {
    // elem is the underlying Javascript object targeted by the .get() command.
    const xyz = Cypress.$(elem).val();
    cy.log(xyz);
});

.then(). позволяет поставить в очередь код, который будет выполняться в последовательности с вашим тестом исполнителем теста. См. этот ответ для получения дополнительной информации об организации очереди и .then().


2) Да, нормально, что describe функции влияют друг на друга. Cypress запускает каждый файл отдельно, но отдельные описания просто запускаются в той последовательности, в которой они находятся в очереди.

Например, следующий код будет работать нормально:

let message = "";

describe("Set a value", () => {
    it("Sets a value", () => {
        message = "hi";
    });
});

describe("Retrieve a value", () => {
    it("Retrieves and prints the set value", () => {
        cy.log(message); // Logs "hi" to the Cypress log window
    });
});
...