如何使用cypress从数据表中获取值?

时间:2019-11-08 10:53:09

标签: cypress

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;
      });
  }

但是我得到了赛普拉斯的回复

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 :(得分:0)

您的方法正确,但搜索的深度不够。这应该有帮助:

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)实际上选择了td的第五次出现,它是“创建于”列的单元格

答案 1 :(得分:0)

从您的问题中我可以理解的是,您只想获取日期值并对此进行断言。

进行假设:应用过滤器后,您总是会得到结果,并且只想为带有日期的单元格编写测试。

这可能会为您提供帮助:

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中。在这里,我仅注销。您可以 在这里提出您的主张。

答案 2 :(得分:0)

问题是调用this.Advertiser函数时should未定义。您没有在该成员的初始位置提供代码,但是我想它是在then内初始化的,或者它是一个属性。无论如何,就像大多数Cypress方法一样,在调用should时,它实际上并不执行验证,而只是将一个稍后排队执行的命令排队以执行验证。这意味着当调用should时,this.Advertiser仍为undefined,即使should <稍后执行了em> command ,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; }); }); 做同样的事情,这意味着您应该嵌套2个this.Brand子句。

我希望我能解释得足够清楚...

答案 3 :(得分:0)

感谢所有人的答复。下面的代码帮助我从数据表中获取所需的值。

const txt = [];
    cy.get("tbody")
      .contains("campaign1")
      .parent()
      .next("td")
      .invoke("text")
      .then(x => {
        txt.push(x);
      });
    cy.log((this.txt = txt));

答案 4 :(得分:0)

我建议您在行/列上分配一个赛普拉斯专用ID,以轻松提取数据,并且测试更易于维护。

<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')