#jquery #cypress
Вопрос:
Не удалось получить значение автоида в jobId
объект, здесь localStorage autoId
представляет собой строку. Не мог бы кто-нибудь, пожалуйста, сообщить об этой проблеме здесь ? Я пытаюсь найти строку таблицы на основе идентификатора задания и проверяю jobRow [columnPosition] == value
, утверждает ли он ее …
примечание: Я пытаюсь оптимизировать и сократить строки кода, насколько это возможно.
let tableDatacy = "Reports_Table";
let columnName= "Customer";
let checkCase = "should";
let value = "Main Customer";
let jobId = {};
const columnPosition = Cypress.$(`[data-cy=${tableDatacy}]`)
.find(`th:has(a:contains(${columnName}))`)
.index()
console.log("Get the silly index !: " columnPosition)
cy.getLocalStorage('autoId').then(autoId => jobId = autoId.jobId);
let jobRow = Cypress.$(`[data-cy=${tableDatacy}] > tbody > tr :contains(${jobId})`);
if (checkCase === "should" amp;amp; jobRow [columnPosition] == value){
result = "true";
expect(result).to.include("true");
} else if (checkCase === "should not" amp;amp; jobRow.length == 0) {
result = "false";
expect(result).to.include("false");
}
Ответ №1:
У вас есть одна асинхронная линия, а все остальные синхронны, поэтому все, от чего зависит jobId
, должно входить внутрь .then()
.
В противном случае синхронный код будет выполнен до завершения асинхронной строки.
const columnPosition = Cypress.$(`[data-cy=${tableDatacy}]`)
.find(`th:has(a:contains(${columnName}))`)
.index()
console.log("Get the silly index !: " columnPosition)
// Make async call and everthing that needs the result
// must be inside the callback
cy.getLocalStorage('autoId').then(autoId => {
jobId = autoId.jobId
// let jobRow = Cypress.$(`[data-cy=${tableDatacy}] > tbody > tr :contains(${jobId})`);
let jobRow = Cypress.$(`[data-cy=${tableDatacy}] > tbody > tr:has(td:contains(${jobId}))`);
// if (checkCase === "should" amp;amp; jobRow [columnPosition] == value){
const jobRowText = Cypress.$(jobRow).find('td').eq(columnPosition).text()
if (checkCase === "should" amp;amp; jobRowText === value) {
result = "true";
expect(result).to.include("true");
// } else if (checkCase === "should not" amp;amp; jobRow.length == 0) {
} else {
result = "false";
expect(result).to.include("false");
}
});
Выбор строки
Так tr :contains(${jobId})
означает «дай мне дитя tr
того , что содержит jobId
, результат есть td
.
но tr:has(td:contains(${jobId}))
означает «дай мне tr
то, что имеет td
то, что содержит jobId
«.
Выбор столбца в строке и сравнение текста
Это jobRow
не массив, это элемент, поэтому вам нужно использовать больше jQuery для извлечения текста для сравнения.
const jobRowText = jobRow.find('td').eq(columnPosition).text()
if (checkCase === "should" amp;amp; jobRowText === value) {
ИЛИ объединить
let jobRowText = Cypress.$(`[data-cy=${tableDatacy}] > tbody > tr:has(td:contains(${jobId}))`)
.find('td').eq(columnPosition).text()
Кипарис командует способом
cy.contains('[data-cy=${tableDatacy}] > tbody > tr', jobId)
.find('td').eq(columnPosition)
.invoke('text')
.then(jobRowText => {
if (checkCase === "should" amp;amp; jobRowText === value) {
result = "true";
expect(result).to.include("true");
} else {
result = "false";
expect(result).to.include("false");
}
})
Комментарии:
1. Постараюсь сделать это в ближайшее время и отвечу
2. Когда я установил
jobId = autoId.JobId
его, он не работал, поэтому мне нужно перейти наjobId = autoId
3. Но в этой строке
let jobRow
я получаю0: td.nameMaxWidth.clickable.saveBackLink length: 1
, но мне нужно получить <tr> правильно, чтобы передать положение столбца ?4. Я добавил скриншот для справки.
5. Хорошо, да, согласен — вы хотите найти строку, которая
jobId
находится в одном столбце, и утверждать истину или ложь, если онаvalue
находится в номере столбца[columnPosition]
. Для этого, я думаю, вы можете использовать:has()
его снова.