Команды 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();
});