Я пытаюсь перебрать таблицу и извлечь значение, если оно нашел значение рядом с ним в таблице с кипарисом

Я пытаюсь перебрать таблицу, извлечь ее значение в переменную и использовать ее в другом поле.

Элементы приведены ниже

  <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 и извлечь его значение в переменную.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы точно знаете, что «СТАН» есть в таблице, вы можете найти его напрямую, без итерации.

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() вы можете получить ошибку из-за неразрывного пробела (&nbsp;), например.

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> со словом «СТАН».

Привет, Аладин! Во-первых, спасибо за ответ. Поэтому я предполагаю, что STAN всегда будет существовать, как и должно быть. Итак, я взял ваш первый раздел кода и добавил следующий код, так как мне нужно взять значение STAN и ввести его в поле поиска, но значение введенного поля поиска не определено. Знаете ли вы, что я могу делать неправильно, это дополнительный код, который я использую.

Michelle Murray 29.04.2024 17:54

.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)"). тип (myVa‌​lue })

Michelle Murray 29.04.2024 17:54

Тест проходит с предоставленным примером HTML, как вы можете видеть на скриншоте. Если cy.get('@myValue').then(value => дает результат undefined, должна быть разница между страницей, которую вы тестируете, и показанным вами HTML. Есть ли какая-то разница, которую вы видите?

Aladin Spaz 30.04.2024 12:02

У вас есть подходящий селектор для cy.get('div[class = "q-pa-md"]').find("input:eq(5)")? Что произойдет, если вы используете cy.get('div[class = "q-pa-md"]').find("input:eq(5)").type("dum‌​myValue"), будет ли он введен в поле?

Aladin Spaz 30.04.2024 12:06

Привет, Аладин, я помещаю его в правильное поле, просто значение не определено, которое я получаю на предыдущем экране, возможно, это что-то связано с таблицей, из которой я его получаю.

Michelle Murray 30.04.2024 14:18

Хорошо, если вы добавите .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() меняет содержимое псевдонима — в этом случае, что делает щелчок? Страница перезагружается?

Aladin Spaz 01.05.2024 02:16

Если, с другой стороны, вы выполняете cy.get('div[class = "q-pa-md"]').find("input:eq(5)").type(myVa‌​lue); во втором тесте, псевдоним не будет работать, поскольку он очищается между тестами.

Aladin Spaz 01.05.2024 02:18

Привет, Аладин! Дело в том, что значение не всегда будет равняться 009466, каждый раз, когда я запускаю тест, число будет меняться. Щелчок возвращает вас к предыдущему, а затем я ввожу НОВЫЙ СТАН и ввожу его в поле поиска. надеюсь, это имеет смысл. Точно так же, как сторона, не .should('eq', '009466'), не дает сбоя, когда я ее ввел,

Michelle Murray 01.05.2024 15:19

Логично, что это не всегда 009466, иначе вам не пришлось бы выполнять запрос, чтобы найти значение. Когда вы говорите «значение, которое я получаю на предыдущем экране, не определено» - означает ли это, что псевдоним потерял свое значение после щелчка?

Aladin Spaz 04.05.2024 06:30

Привет, Аладин, я не думаю, что он понял это вообще, см. мой ответ ниже, который работает

Michelle Murray 07.05.2024 16:29
Ответ принят как подходящий

Итак, после некоторой работы это ответ, который работает:

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 07.05.2024 21:48

Также плохо поставлен вопрос - где в выложенном коде находится клик?

V.Krieps 07.05.2024 21:49

Я согласен с @V.Krieps, ваш ответ может сработать сейчас, но может оказаться ненадежным в будущем в зависимости от скорости сети и т. д. - когда вы используете жесткое ожидание, вы не можете быть уверены, что выбрали правильное время ожидания. Вы можете столкнуться с ошибкой, которую будет сложно отладить, поскольку окружающая среда замедляет работу за пределы двух секунд, которые вы выбрали для ожидания. Cypress был создан для обработки задержек среды с помощью функции повтора, поэтому лучше всего вместо этого использовать cy.get(something).should('be.visible'), где something — это элемент, который появляется после завершения click().

Aladin Spaz 08.05.2024 22:36

Привет, Аладин! Однако это не удается, так как он пытается найти элемент на экране, но никогда этого не делает. так должно ли получение чего-то автоматически ждать?

Michelle Murray 10.05.2024 15:59

Зачем вам выбирать something, который не работает?

Cara Gee 11.05.2024 02:58

Другие вопросы по теме