Cypress.io: функция для выбора случайного элемента и получения его текста - PullRequest
0 голосов
/ 14 апреля 2020

В настоящее время я работаю с Cypress и создал функцию, которая случайным образом щелкает элемент из списка. Я пытаюсь также получить текст из той же функции для будущих утверждений. Проблема в том, что я не могу правильно вернуть текст. Код, который у меня сейчас есть:

    export function selectRandomFromList(listLocator, elementLocator) {
    cy.get(listLocator).within(() => {
       let numberOfElements = Cypress.$(listLocator + ' ' + elementLocator).length
       let selected = Cypress._.random(0, numberOfElements - 1)
        cy.get(elementLocator).eq(selected).then(($text) => {
                const text = $text.text()
                return text
        }).click()
    })
  }

Я надеялся, что смогу в этом тесте запустить эту функцию, сделать щелчок и затем сохранить возвращенный текст в переменной для дальнейшей проверки. Что я делаю неправильно? Также пробовал некоторые другие вещи с обещаниями и тому подобное, когда код говорил, что я пытаюсь смешать syn c и asyn c ..

Забыл добавить. Это в файле поддержки, и я хочу использовать переменную text в тестовом файле. Примерно так:

var text = function.selectRandomFromList('[class*=***]', 'li ul li button')

После чего у меня должен быть текст нажатой кнопки в text.

1 Ответ

1 голос
/ 14 апреля 2020

Команды Cypress работают так же, как и Promises. Вы должны вернуть Обещание, когда находитесь внутри then() обратного вызова. См. Do c здесь .

Вы можете использовать cy.wrap($text).invoke('text') в вашем then() обратном вызове вместо возврата строки. Но тогда ваш click() не будет работать, потому что ваш then() даст текстовое значение, которое нельзя щелкнуть.

Я предлагаю не использовать within() и работать напрямую с элементами. Вы получите тот же результат, но с меньшей сложностью. Я использую команду within(), когда мне нужно выполнить несколько действий, например, над несколькими элементами в контейнере div.

Вы можете выполнять то, что вам нужно, с помощью команд по умолчанию вместо функции:

let mixLocator = listLocator + ' ' + elementLocator;
cy.get(mixLocator).its('length').then(elementCount => {
    let selected = Cypress._.random(elementCount - 1); // lower = 0 is default
    cy.get(mixLocator).eq(selected).click().invoke('text').as('selectedText'); // saving the text as an alias to be used later
});

Здесь invoke('text') все равно должен работать, даже если он идет после click(), но невозможно сделать обратное invoke('text').click(), потому что команда invoke('text') выдает строку. Если этого не произойдет, вызовите его один раз, чтобы получить текст, и еще раз щелкните по нему:

cy.get(mixLocator).eq(selected).invoke('text').as('selectedText');
cy.get(mixLocator).eq(selected).click();

или:

cy.get(mixLocator).eq(selected).then(selectedElement => {
    cy.wrap(selectedElement).invoke('text').as('selectedText');
    cy.wrap(selectedElement).click();
});

Затем вы можете использовать сохраненный псевдоним позже:

cy.get('@selectedText').then(selectedText => {
    // use selectedText here
});

Я часто предпочитаю выбирать случайные элементы в наших тестах, чтобы иметь лучшее покрытие. Я придумал пользовательских команд :

. js

Cypress.Commands.add('any', { prevSubject: 'element' }, (subject, size = 1) => {
  cy.wrap(subject).then(elementList => {
    elementList = (elementList.jquery) ? elementList.get() : elementList;
    elementList = Cypress_.sampleSize(elementList, size);
    elementList = (elementList.length > 1) ? elementList : elementList[0];
    cy.wrap(elementList);
  });
});

Я использую это так:

cy.get(elementLocator).any().click();

или

cy.get(elementLocator).any(5).each(randomElement => {
    cy.wrap(randomElement).click();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...