Как получить значение из данных с помощью кипариса? - PullRequest
0 голосов
/ 08 ноября 2019

enter image description here Я хочу получить «Дата создания» из таблицы данных, чтобы выяснить, в какой часовой пояс он попадает?

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

    cy.get('input[placeholder="Filter..."]:nth(2)').type("campaign1");
    cy.get("tbody")
      .contains("campaign1")
      .closest("tr")
      .should("contain.text", this.Advertiser)
      .should("contain.text", this.Brand)
      .then(text => {
        const rowText = text;
      });
  }

Но я получил этот ответ от Cypress

CypressError: Timed out retrying: expected '<tr.MuiTableRow-root>' to contain text undefined, but the text was 'Advertiser UKBrand UKcampaign14 Nov 2019'

Как мне извлечь только дату из таблицы данных? enter image description here

Ответы [ 5 ]

0 голосов
/ 11 ноября 2019

Я бы посоветовал вам назначить выделенный для кипариса идентификатор в строке / столбце, чтобы легко извлекать данные, и тесты более удобны в обслуживании.

<tr data-cy='campaign-${id}' ...>
  <td data-cy='created-on'>
   ....
  <td>
</tr>

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

cy.get('[data-cy=campain-3]').find('[data-cy=created-on]').invoke('text')
0 голосов
/ 08 ноября 2019

Спасибо всем за ответы. Приведенный ниже код помог мне получить нужное значение из таблицы данных.

const txt = [];
    cy.get("tbody")
      .contains("campaign1")
      .parent()
      .next("td")
      .invoke("text")
      .then(x => {
        txt.push(x);
      });
    cy.log((this.txt = txt));
0 голосов
/ 08 ноября 2019

Что я могу понять из вашего вопроса, так это то, что вы просто хотите получить значения даты и сделать на этом подтверждение.

Предположение сделано: с применением фильтра вы всегда получаете результаты и хотите писать тесты только для ячейки с датой.

Это может помочь вам:

function getTextOfCell(rowIndex){
  cy
  .get('tbody.MultiTableBody-root')
  .get('tr.MultiTableRow-root')
  .eq(rowIndex)
  .find('td').eq(3).invoke('text').then((txt)=>{
    cy.log(txt)
  })
}

describe('Test Test', ()=>{
  it('Test Test', ()=>{
    cy.visit('yourURl')
    cy.get('tbody.MultiTableBody-root tr.MultiTableRow-root').its('length').then((rowLength)=>{
      for(let i=0; i<rowLength; i++){
        getTextOfCell(i)
      }
    });
  })
})

Примечание:

  • Я предполагаю, что иногда у вас будет несколько строк в результате. Итак, перебираем все доступные строки.
  • И ячейка даты всегда будет иметь индекс 3. для любой строки.
  • В функции getTextOfCell мы берем текст ячейки и сохраняем его в txt. Здесь я выхожу только. Вы можете сделать свое утверждение здесь.
0 голосов
/ 08 ноября 2019

Проблема в том, что this.Advertiser не определено при вызове функции should. Вы не предоставили кусок кода, где этот элемент инициализирован, но я думаю, что он инициализирован внутри then или это свойство. В любом случае, как и большинство методов Cypress, когда вызывается should, он фактически не выполняет проверку, а только ставит в очередь команду, которая будет выполнена позже для выполнения проверки. Это означает, что когда вызывается should, this.Advertiser по-прежнему undefined, и это передается в качестве аргумента функции should, даже если команда should выполняется позже, this.Advertiser имеет допустимое значение.

Решение должно заключаться в том, чтобы вместо использования this.Advertiser поместить весь блок кода, который появляется в вашем вопросе, в блок then, где значение, в котором this.Advertiser инициализируется, и вместо него используется параметр, переданный этому блоку then. Это должно выглядеть примерно так:

cy.somethingThatProvidesAdvertiser().then(advertiser => {
  cy.get('input[placeholder="Filter..."]:nth(2)').type("campaign1");
  cy.get("tbody")
    .contains("campaign1")
    .closest("tr")
    .should("contain.text", advertiser)
    .should("contain.text", this.Brand)
    .find("td")
    .eq(5)
    .then(text => {
      const rowText = text;
    });
  });

Я полагаю, что вы должны сделать то же самое для this.Brand, что означает, что вы должны иметь вложенные 2 then предложения.

Iнадеюсь, мне удалось объяснить это достаточно ясно ...

0 голосов
/ 08 ноября 2019

Вы на правильном пути, но вы недостаточно глубоко ищете. Это должно помочь:

cy.get('input[placeholder="Filter..."]:nth(2)').type("campaign1");
cy.get("tbody")
  .contains("campaign1")
  .closest("tr")
  .should("contain.text", this.Advertiser)
  .should("contain.text", this.Brand)
  .find("td")
  .eq(5)
  .then(text => {
    const rowText = text;
  });

Вы нашли правильную строку, но не правильную ячейку. Добавляя find("td"), он выполняет поиск ячеек. И .eq(5) фактически выбирает 5-й случай td, который является ячейкой для столбца «Создано»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...