使用by.id定位元素时Protractor报多元素匹配错误求助
看起来你碰到了两个核心问题:一是页面上存在多个ID为txt1的元素导致Protractor定位混乱,二是对输入框的值获取方式有误。下面一步步帮你解决:
1. 为什么会出现"more than one element found"错误?
根据错误提示,页面上不止一个元素的ID是txt1——虽然HTML规范要求ID必须唯一,但从你的Vue代码来看,大概率是循环渲染表单字段时,currentField.id被重复赋值了,或者某个隐藏元素(比如你的label标签)意外被设置了相同ID。你可以打开浏览器开发者工具,搜索#txt1来确认所有匹配的元素。
Protractor的element(by.id('txt1'))默认会取第一个匹配到的元素,刚好是你的label标签,所以调用getText()会返回label的文本,这就是不符合预期的原因。
2. 正确的定位与取值方案
方案一:精确定位到输入框元素
既然目标是el-input(最终会渲染成<input>标签),可以结合标签名和ID来缩小定位范围,确保只匹配输入框:
// 直接定位到id为txt1的input元素 var txtEl = element(by.css('input#txt1'));
方案二:如果确实存在多个同ID元素(不推荐,但应急可用)
如果业务场景导致无法避免重复ID,可以用element.all()获取所有匹配元素,再通过索引选取目标输入框(注意索引从0开始):
// 假设输入框是第二个匹配项 var txtEl = element.all(by.id('txt1')).get(1);
方案三:正确获取输入框的值
就算定位到了正确的输入框,用getText()也拿不到输入值——因为输入框的内容存储在value属性里,而非元素的文本内容。你需要用getAttribute('value')来获取:
txtEl.getAttribute('value').then(function(inputValue) { console.log('输入框的值:', inputValue); }); // 或者用async/await语法(如果你的环境支持) async function getInputValue() { const value = await txtEl.getAttribute('value'); console.log('输入框的值:', value); }
3. 为什么原生JS能正常获取值?
你用的this.$refs.form1["txt1"].value是直接通过Vue的refs访问到了对应的输入框组件实例,它直接指向了底层的input元素并读取了value属性,所以能拿到正确值——这和Protractor的定位逻辑不同,Protractor是基于DOM元素的选择器来查找的,所以需要确保定位到正确的DOM元素,再用正确的方法获取值。
内容的提问来源于stack exchange,提问作者Krishnan VS

