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

如何使用cypress从数据表中获取值?,cypress,Cypress,我想从datatable中获取“Created On Date”,以确定它属于哪个时区 我正在使用筛选器搜索特定的活动。但我不确定如何从数据表中提取文本 cy.get('input[placeholder="Filter..."]:nth(2)').type("campaign1"); cy.get("tbody") .contains("campaign1") .closest("tr") .should("contain.text", th

我想从datatable中获取“Created On Date”,以确定它属于哪个时区

我正在使用筛选器搜索特定的活动。但我不确定如何从数据表中提取文本

    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;
      });
  }
const txt = [];
    cy.get("tbody")
      .contains("campaign1")
      .parent()
      .next("td")
      .invoke("text")
      .then(x => {
        txt.push(x);
      });
    cy.log((this.txt = txt));
但我得到了Cypress的回应

CypressError: Timed out retrying: expected '<tr.MuiTableRow-root>' to contain text undefined, but the text was 'Advertiser UKBrand UKcampaign14 Nov 2019'
CypresError:超时重试:预期“”包含未定义的文本,但该文本为“广告商UKBrand UKAMPATIVATION 2019年11月14日”

如何仅从数据表中提取日期?

您的方法是正确的,但搜索不够深入。这将有助于:

cy.get('input[placeholder=“Filter…”):n(2)')。键入(“活动1”);
cy.get(“tbody”)
.包含(“活动1”)
.最近的(“tr”)
.should(“contain.text”,此为广告客户)
.should(“contain.text”,this.Brand)
.查找(“td”)
.eq(5)
。然后(文本=>{
const rowText=文本;
});

您确实找到了正确的行,但没有找到正确的单元格。通过添加
find(“td”)
来搜索单元格。而
.eq(5)
实际上选择了第五个出现的
td
,这是创建于列的单元格。从您的问题中我可以理解的是,您只需要获取日期值并对其进行断言

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

这可能会帮助您:

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)
      }
    });
  })
})
函数getTextOfCell(行索引){ 赛义德 .get('tbody.MultiTableBody root') .get('tr.MultiTableRow-root') .eq(行索引) .find('td').eq(3).调用('text')。然后((txt)=>{ cy.log(txt) }) } 描述('测试',()=>{ 它('测试',()=>{ cy.visit('yourURl') cy.get('tbody.MultiTableBody-root tr.MultiTableRow-root')。其('length')。然后((rowLength)=>{
对于(设i=0;i问题在于
this。当调用
should
函数时,广告商
是未定义的。您没有提供初始化此成员的代码段,但我猜它是在
内部初始化的,然后
或者它是一个属性。无论如何,与大多数Cypress方法一样,当调用
should
时,它会esn实际上不执行验证,但只将稍后将执行的命令排队以执行验证。这意味着当调用
should
时,
This。广告商仍然
未定义
,这将作为参数传递给
should
函数,即使
should
函数mmand稍后执行,
此。广告客户
具有有效值

解决方案应该是,不要使用
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个
然后
子句


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

谢谢大家的回复。下面的代码帮助我从数据表中获取所需的值

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

我建议您在行/列上指定一个cypress专用id,以便轻松提取数据,并且测试更易于维护

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

谢谢J。但我仍然收到相同的错误
CypressError:超时重试:预期“”包含未定义的文本,但文本为“Advertiser UKBrand UKAMPATIVATION 2019年11月14日”
Cypress似乎从未到达
then()
,但由于一个应失败,已经退出。您能尝试在
应之后删除所有内容吗(“contain.text”,this.Advertiser)
。我打赌您的测试仍然会失败。Cypress希望某些内容是“未定义”的,这可能就是this.Advertiser
的值。您还可以将其放入日志()中进行验证,如:
cy.log(this.Advertiser)
``cy.get(“tbody”).contains(“活动1”).parent().next(“td”)``标识的'2019年11月4日',但如何获取该值并将其存储在变量中以供将来断言
cy.get(“tbody”).contains(“活动1”).parent().next(“td”).invoke(“文本”).as(“txt”);cy.log(this.txt);
返回空值