Protractor调用allBtns.count()报错:TypeError: allBtns.count is not a function
问题分析与解决
你遇到的TypeError: allBtns.count is not a function错误,核心原因是错误地对element.all()返回的ElementArrayFinder执行了await。
为什么会出错?
在Protractor中:
element.all()直接返回的是ElementArrayFinder对象,这个对象自带count()、first()等专属方法;- 如果你对
element.all()执行await,得到的会是普通的DOM元素数组,而普通JavaScript数组并没有count()方法,这就直接导致了报错。
再看你的代码片段:
let allBtns = await element.all(by.className('btn btn-remove btn-outlined desktop')); let countElement = await allBtns.count();
这里await element.all(...)把allBtns转换成了普通数组,自然调用count()会触发类型错误。另外你已经在getRemoveButtonDesktop()里封装了相同的定位器,完全没必要重复编写,直接复用更规范。
修正后的代码
it('Clicked all remove button', async function () { // 直接复用你定义好的ElementArrayFinder,无需await const allBtns = detailsSpecs.getRemoveButtonDesktop(); // 调用ElementArrayFinder的count()方法,这里需要await获取实际数量 const countElement = await allBtns.count(); console.log('Find buttons: ', countElement) for (let i = 0; i < countElement; i++) { // 每次点击后按钮会被移除,下一个目标会自动变成第一个 const firstRemoveButton = allBtns.first(); await utils.click(firstRemoveButton); await browser.sleep(1000); // 休眠1秒等待页面更新 } });
额外优化建议
- 避免重复定位:既然已经在
getRemoveButtonDesktop()里封装了按钮定位逻辑,就不要在测试代码里重复写element.all(by.className(...)),减少冗余同时便于后续维护。 - 替换固定休眠:如果项目允许,尽量用Protractor的
browser.wait()方法等待元素状态变化(比如等待按钮数量减少),比固定的browser.sleep()更稳定,能适配不同加载速度的环境。
内容的提问来源于stack exchange,提问作者PythonNewbie
相关产品推荐
相关产品推荐

