Я пытаюсь перебрать таблицу, извлечь ее значение в переменную и использовать ее в другом поле.
Элементы приведены ниже
<tbody>
<tr class>
<td class = "text-left">Transaction Type </td>
<td class = "text-left">0 </td>
</tr>
<tr class>
<td class = "text-left">STAN </td>
<td class = "text-left">009466 </td>
</tr>
Я хочу извлечь числовое значение, когда оно найдет значение STAN, и использую этот код
cy.get('tbody tr').each(($el) => {
cy.wrap($el).within(() => {
cy.get('td').eq(1).should('contain.text', 'STAN') // contains() doesn't work
})
})
Я использовал следующий скрипт, но он не работает, и я знаю, что он еще не закончен. Пожалуйста, помогите мне найти STAN и извлечь его значение в переменную.
Если вы точно знаете, что «СТАН» есть в таблице, вы можете найти его напрямую, без итерации.
cy.contains('tbody tr', 'STAN') // get the row with "STAN"
.find('td').eq(1) // it's second column
.then($el => {
const text = $el.text() // extract the text
const trimmed = text.trim() // remove the space at the end
return trimmed
})
.as('myValue') // save it to an alias
.should('eq', '009466') // just for proof (you may not know the value)
// later in the test
cy.get('@myValue').then(value => {
...
})
В вашем примере HTML после значения есть пробел, поэтому я использовал text.trim()
, чтобы удалить его. Без .trim()
вы можете получить ошибку из-за неразрывного пробела (
), например.
cy.contains('tbody tr', 'STAN')
.find('td')
.eq(1)
.invoke('text')
.as('myValue') // save to alias
.should('eq', '009466')
Что, если «СТЭН» может не существовать?
В идеальном тесте вы бы использовали cy.intercept()
для настройки данных таблицы, чтобы знать, что «СТАН» есть в таблице.
Но если по какой-то причине это невозможно, вы можете сначала проверить:
cy.wrap(undefined).as('myValue') // set up initial alias as undefined
cy.get('tbody tr' )
.then($rows => {
const rowWithSTAN = $rows.has('td:contains(STAN)') // non-failing query
if (rowWithSTAN.length) { // check the result
cy.wrap(rowWithSTAN) // as per above example
.find('td')
.eq(1)
.then($el => {
const text = $el.text()
const trimmed = text.trim()
return trimmed
})
.as('myValue')
.should('eq', '009466')
}
})
// later in the test
cy.get('@myValue').then(value => {
if (value) {
// only if not undefined
}
})
Строка $rows.has('td:contains(STAN)')
говорит: отфильтруйте строки, чтобы получить только ту строку, в тексте которой есть <td>
со словом «СТАН».
.as('myValue') // сохраняем его под псевдонимом cy.get('.text-primary > .q-breadcrumbs__el').click(); cy.get('@myValue').then((myValue) => { cy.get('div[class = "q-pa-md"]').find("input:eq(5)"). тип (myValue })
Тест проходит с предоставленным примером HTML, как вы можете видеть на скриншоте. Если cy.get('@myValue').then(value =>
дает результат undefined
, должна быть разница между страницей, которую вы тестируете, и показанным вами HTML. Есть ли какая-то разница, которую вы видите?
У вас есть подходящий селектор для cy.get('div[class = "q-pa-md"]').find("input:eq(5)")
? Что произойдет, если вы используете cy.get('div[class = "q-pa-md"]').find("input:eq(5)").type("dummyValue")
, будет ли он введен в поле?
Привет, Аладин, я помещаю его в правильное поле, просто значение не определено, которое я получаю на предыдущем экране, возможно, это что-то связано с таблицей, из которой я его получаю.
Хорошо, если вы добавите .should('eq', '009466')
после .as('myValue')
, как я сделал выше, это подтвердит, что значение попадает в псевдоним. Если вы также поставите .should('eq', '009466')
после cy.get('@myValue')
, это сообщит вам, имеет ли псевдоним значение, следующее за cy.get('.text-primary > .q-breadcrumbs__el').click();
. Если cy.get('@myValue').should('eq', '009466')
не проходит, то действие .click()
меняет содержимое псевдонима — в этом случае, что делает щелчок? Страница перезагружается?
Если, с другой стороны, вы выполняете cy.get('div[class = "q-pa-md"]').find("input:eq(5)").type(myValue);
во втором тесте, псевдоним не будет работать, поскольку он очищается между тестами.
Привет, Аладин! Дело в том, что значение не всегда будет равняться 009466, каждый раз, когда я запускаю тест, число будет меняться. Щелчок возвращает вас к предыдущему, а затем я ввожу НОВЫЙ СТАН и ввожу его в поле поиска. надеюсь, это имеет смысл. Точно так же, как сторона, не .should('eq', '009466'), не дает сбоя, когда я ее ввел,
Логично, что это не всегда 009466
, иначе вам не пришлось бы выполнять запрос, чтобы найти значение. Когда вы говорите «значение, которое я получаю на предыдущем экране, не определено» - означает ли это, что псевдоним потерял свое значение после щелчка?
Привет, Аладин, я не думаю, что он понял это вообще, см. мой ответ ниже, который работает
Итак, после некоторой работы это ответ, который работает:
cy.get('table tbody tr td').each(ele => {
if (ele.text()== = "STAN"){
let value = ele.next().text();
cy.get('.text-primary > .q-breadcrumbs__el').click();
cy.wait(2000);
cy.get('div[class = "q-pa-md"]').find("input:eq(5)").type(value);
}
});
Использование cy.wait(2000)
— плохая практика. Если это сработает сейчас, позже это может дать сбой. Вместо этого используйте утверждение .should()
на чем-то на странице, которая появляется после клика.
Также плохо поставлен вопрос - где в выложенном коде находится клик?
Я согласен с @V.Krieps, ваш ответ может сработать сейчас, но может оказаться ненадежным в будущем в зависимости от скорости сети и т. д. - когда вы используете жесткое ожидание, вы не можете быть уверены, что выбрали правильное время ожидания. Вы можете столкнуться с ошибкой, которую будет сложно отладить, поскольку окружающая среда замедляет работу за пределы двух секунд, которые вы выбрали для ожидания. Cypress был создан для обработки задержек среды с помощью функции повтора, поэтому лучше всего вместо этого использовать cy.get(something).should('be.visible')
, где something
— это элемент, который появляется после завершения click()
.
Привет, Аладин! Однако это не удается, так как он пытается найти элемент на экране, но никогда этого не делает. так должно ли получение чего-то автоматически ждать?
Зачем вам выбирать something
, который не работает?
Привет, Аладин! Во-первых, спасибо за ответ. Поэтому я предполагаю, что STAN всегда будет существовать, как и должно быть. Итак, я взял ваш первый раздел кода и добавил следующий код, так как мне нужно взять значение STAN и ввести его в поле поиска, но значение введенного поля поиска не определено. Знаете ли вы, что я могу делать неправильно, это дополнительный код, который я использую.