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

使用Protractor自动化AngularJS站点时点击按钮遇元素定位错误求助

解决Protractor中"more than one element found"的按钮定位警告

嘿,我明白你遇到的问题了——这个警告是说页面上不止一个按钮包含"शोधा"这个文本,Protractor默认帮你选了第一个,但这可能不是你想要的目标元素,或者你只是想消除这个烦人的警告。下面给你几个靠谱的解决方案:

1. 用精确文本匹配替代部分匹配

如果目标按钮的文本就是完整的"शोधा",没有其他额外字符,那直接用by.buttonText替代by.partialButtonText就好,这样定位范围会窄很多:

element(by.buttonText('शोधा')).click();

2. 明确指定取第一个匹配元素

如果你确定第一个匹配的元素就是你要点击的,那可以用element.all()主动获取元素列表,再取第一个,这样就不会触发警告了:

element.all(by.partialButtonText('शोधा')).first().click();

3. 结合其他属性做精准定位

如果页面上有多个带"शोधा"的按钮,你可以结合按钮的其他属性(比如class、id、父容器、ng-click指令等)来缩小范围。比如假设目标按钮在某个带特定class的容器里,或者有特定的ng-click属性:

// 示例:结合父容器和按钮文本定位
element(by.css('div.search-container button:contains("शोधा")')).click();

// 示例:结合ng-click属性定位(如果按钮有这个属性的话)
element(by.css('button[ng-click="searchRecords()"]')).click();

修改后的测试代码示例

这里给你把最后一行替换成明确取第一个元素的版本,这样就能消除警告了:

describe('angularjs homepage', function() {
  it('should greet the named user', function() {
    browser.get('https://mahabhulekh.maharashtra.gov.in/');
    element(by.partialLinkText('अमरावती')).click();
    browser.sleep('5000');
    element(by.model("distCode")).$('[value="string:4"]').click();
    browser.sleep('5000');
    element(by.model("talCode")).$('[value="number:7"]').click();
    browser.sleep('5000');
    element(by.model("vilCode")).$('[value="string:270400070038950000"]').click ();
    browser.sleep('5000');
    element(by.id('rbsryno')).click();
    browser.sleep('5000');
    element(by.model("sno")).sendKeys("10");
    browser.sleep('5000');
    // 替换成明确取第一个匹配元素的写法
    element.all(by.partialButtonText('शोधा')).first().click();
    browser.sleep('5000');
  });
});

另外提个小建议:尽量少用browser.sleep(),可以用browser.wait()配合Expected Conditions来等待元素可点击,这样测试会更稳定哦!

内容的提问来源于stack exchange,提问作者user1358401

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:49:30