如何从下拉元素数组中选择值?Protractor报错求助
解决Protractor中
element.all(...).get(...).click(...).element.all is not a function错误 嘿,我来帮你分析下这个问题:
首先,这个错误的核心原因很直观:Protractor里的click()方法返回的是一个Promise(异步操作的结果),而不是元素对象,所以你不能在click()后面直接链式调用.element.all()这类元素定位方法——Promise根本没有这个方法嘛!
另外,你的代码里还有个容易忽略的小问题:by.className()并不支持传入空格分隔的多个类名(比如你写的'btn btn-default dropdown-toggle'),这个方法只能匹配单个类,所以用它定位按钮大概率会出问题。
修正后的代码方案
我推荐用async/await来处理Protractor的异步操作,代码逻辑更清晰,也符合现代测试的写法:
// 改用css选择器定位第一个下拉按钮(支持多类名匹配) const firstDropdownBtn = element.all(by.css('button.btn.btn-default.dropdown-toggle')).get(0); // 先点击下拉按钮,等待这个异步操作完成 await firstDropdownBtn.click(); // 等待下拉菜单中的选项加载完成并可见,再定位目标选项 const companyManagedOption = element.all(by.repeater('lookupData in lookupDataValues | filter: filteredValue')).get(0); // 添加等待,避免页面加载慢导致元素不可交互 await browser.wait(ExpectedConditions.visibilityOf(companyManagedOption), 5000); await companyManagedOption.click();
关键优化点说明
- 拆分链式调用:把
click()和后续的元素定位拆成独立步骤,确保点击操作完全完成后,再去查找下拉选项。 - 修复定位方式:用
by.css()替代by.className()来匹配多类名的按钮,保证能正确找到目标元素。 - 添加等待条件:通过
browser.wait()配合ExpectedConditions,确保下拉选项确实加载出来并可见后再点击,避免因页面异步渲染导致的报错。
更稳定的定位(可选)
如果担心下拉选项的顺序会变,你还可以直接通过文本内容定位Company Managed,这样更精准:
await firstDropdownBtn.click(); // 直接匹配包含目标文本的选项 const companyManagedOption = element(by.cssContainingText('li.ng-scope a', 'Company Managed')); await browser.wait(ExpectedConditions.visibilityOf(companyManagedOption), 5000); await companyManagedOption.click();
这样不管选项排序怎么变,都能准确点到你要的「Company Managed」。
内容的提问来源于stack exchange,提问作者Ashish
相关产品推荐
相关产品推荐

