Protractor中如何批量获取元素子节点并搜索特定名称?
解决重复定位元素与批量搜索的方案
嘿,我完全懂你这种重复写代码的痛苦!不用再一个个定义test1到test15了,我们用Protractor的集合操作就能优雅解决这个问题,还能轻松实现特定名称的搜索。
第一步:一次性获取所有子元素集合
首先,你需要用element.all()来定位所有的session-item元素,而不是单个元素:
// 获取目标grid下的所有session-item元素集合 const allSessionItems = element.all(by.css('div.scroll-content ion-grid:nth-child(5) session-item'));
这样你就拿到了所有20个子元素的集合,不用再逐个定义变量啦。
第二步:用filter()高效搜索特定名称
如果你想在所有子元素里找包含特定名称的元素,完全不需要一堆if判断,用filter()方法就能搞定——它会遍历整个集合,帮你筛选出符合条件的元素:
// 搜索包含"目标名称"的元素(这里可以换成你要找的名称) const targetSessionItem = allSessionItems.filter((item) => { // 获取每个元素的文本内容(如果名称在子元素里,就定位子元素再getText) return item.getText().then((itemText) => { return itemText.includes("你的特定名称"); // 模糊匹配,精确匹配用=== }); }).first(); // 取第一个匹配的元素,要所有匹配的就去掉.first()
之后你就可以直接对targetSessionItem做操作,比如targetSessionItem.click()。
为什么你之前的写法无效?
你之前尝试的element(by.css('...session-item:nth-child')).get(1)是错误的:
element(by.css(...))定位的是单个元素,不能调用get()方法;- 只有
element.all()返回的元素集合才能用get(index)来获取指定位置的元素(注意:Protractor的索引是从0开始的,所以get(0)是第一个元素,get(1)是第二个)。
额外技巧:遍历所有元素做批量操作
如果需要遍历所有元素做检查或操作,可以用each()方法:
allSessionItems.each((item, index) => { item.getText().then((text) => { console.log(`第${index + 1}个元素的文本:${text}`); // 找到目标元素后执行操作 if (text.includes("目标名称")) { item.click(); } }); });
更精准的定位(可选)
如果名称是在session-item的某个子元素里(比如带有.session-name类的标签),可以直接定位子元素来获取名称,避免获取整个元素文本的干扰:
const targetItem = allSessionItems.filter((item) => { return item.element(by.css('.session-name')).getText().then((name) => { return name === "精确匹配的名称"; }); }).first();
这样下来,你不仅省去了重复定义变量的麻烦,还能高效实现搜索需求,代码也更简洁易维护!
内容的提问来源于stack exchange,提问作者Fábio Heitor
相关产品推荐
相关产品推荐

