我正在使用过滤器搜索特定的广告系列。但是我不确定如何从数据表中提取文本。
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'
答案 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)
}
});
})
})
注意:
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')