selenium - 如何通过多个文本匹配单击一个元素?
问题描述
我有一些有不同领域的卡片。文本看起来像这样。
梗犬
2 岁
名称雷克斯
科罗拉多州位置
我需要通过多个文本匹配一张卡片。所以element(by.cssContainingText('#age', 'Age 2'))
不是很有帮助,因为我还需要 '#location' 来匹配 'Colorado'。
我尝试的是链接element.all(by.cssContainingText('#card','Age')).element.all(by.cssContainingText('#location', 'Colorado'))
,但它似乎不起作用而且非常混乱。最终目标是点击匹配的第一张卡片。
我还尝试创建一个与文本匹配的函数。但是,如果第一次单击后有多个匹配项,它也会尝试单击下一个匹配项,我会收到一个过时的元素错误。
public clickDogCardByAgeAndLocation(age: string, location: string) {
common.waitForElement($('dog-card'));
$$('dog-card').each(element => {
element.getText().then(text => {
if (text.includes(age) && text.includes(location)) {
console.log('CARD SUCCESS');
element.click();
}
});
});
}
我相信有一种更优雅的方法可以做到这一点。谢谢!
解决方案
如果所有文本都在一个元素上,则可以使用 xpath 查找多个条件,如下所示:
//p[contains(text(),'I am')][contains(text(),'more elegant')][contains(text(),'do this')]
如果您的文本跨越多个子元素,您可以通过像这样包装该标识符来选择父卡:
//div[p[contains(text(),'I am')][contains(text(),'more elegant')][contains(text(),'do this')]]
那就是包含那些文本条件div
的那个。p
还有一些 xpath 修饰符可以更容易地阅读这样的和和或:
//p[contains(text(),'I am') and contains(text(),'more elegant')]
您可以在此页面上尝试所有这些 :-)
如果您有更复杂的对象,请分享您的 html,我可以提供更定制的帮助。
推荐阅读
- arrays - 根据子列表过滤主列表
- python - 我想要一个像 redis pubsub 中的 kafka client_id 这样的函数
- multithreading - 在 Powershell 中使用 Start-ThreadJob 复制项目
- java - Spring +Mongodb Query 用于添加和删除内部数组
- grafana - Telegraf 问题:[outputs.influxdb] 度量缓冲区溢出;已删除 3645 个指标
- r - 如何有效地计算R中稀疏矩阵每一行的平方和?
- spring-batch - 使用哪个更好的方法来使 joblauncher 异步?
- javascript - 如何修复角度日期选择器过滤器
- python - 如何用该字符串的递增值替换文本文件中的字符串
- python - Python PyQT5 webview在需要插件时混合url