我指向中间的表格单元格,我可以使用next()
方法获取下一个单元格的文本,但当我试图使用parent()
时,我得到了三个单元格的整行文本。下面是HTML代码。请帮助。
cy.get('[name="courses"] > tbody >tr >td:nth-child(2)').each((e1, index) => {
const course = e1.text()
if (course.includes('Python')) {
cy.get('[name="courses"] > tbody >tr >td:nth-child(2)').eq(index).parent()
.then((price) => {
const courseprice = price.text()
// expect(courseprice).to.be.equal('25')
cy.log(courseprice)
})
}
})
5条答案
按热度按时间zdwk9cvp1#
对于包含“Python”的第一行,
.contains(selector, text)
是最短的,.next()
为您提供价格列。如果多行包含Python,则改为伪选择器
:contains()
r3i60tvu2#
文本是整个文本的原因是它组合了所有子元素的文本。为了避免这种情况,我们可以采取几种不同的路线:
第一溶液:我们可以检查父对象是否包含值:
第二解决方案:直接抢第三排TD
quhf5bfb3#
更容易的做法是迭代行并检查第二行,而不是迭代第二行,然后遍历DOM以获取价格,然后使用
cypress-if
这是一个最小的可复制example。
14ifxucb4#
另一个选择,我的首选方法是使用
find
,我也建议不要使用then
或其他嵌套函数,如each
,如果你不需要它。即使你可以使用jquery选择器,如nth-child()
,使用eq()
使它更可读一点。nth-child
的索引不是从0开始的,而是从1开始的,所以nth-child(2)
返回第二列,而不是第三列。例如,这将给予第8行和第3列
如果我在测试中重复任何东西超过两次,我倾向于在规范中编写帮助函数。
在某些情况下,根据您的html标记,文本可能会用白色填充。在这种情况下,您可能希望使用
contain.text
而不是have.text
,但这也可能导致问题,例如125
将匹配contain.text("25")
。另一种选择
另外,如果你想从一个选择器中找到一个子元素,你可以使用
find
。在这个例子中,我添加了.find('td').eq(2)
。但是请注意,这个例子展示了一个非常复杂的上下搜索DOM的方法。vh0rcniy5#
在使用
parent
之后,您可以使用within
进入父tr
并访问每个td
元素,如下所示:您可以基于第二个
td
来达到第一个td
,如下所示: