You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 22:22:35