Protractor测试中点击Send按钮无响应问题求助
解决Protractor点击"Send"按钮无响应的问题
嘿,我来帮你排查一下这个点击按钮没生效的问题~先看看你的按钮HTML结构:
<button id="recover-credentials-submit" ng-class="{disabled: disabled, "btn-primary": true}" ng-disabled="disabled" type="submit" class="btn btn-primary pull-right"> <span title="send recover email" aria-hidden="true" class="fa fa-key"></span> Send </button>
你用element(by.buttonText('Send'))定位没反应,大概率是这些原因,对应的修复方案给你列出来了:
1. 按钮文本藏了个看不见的空格
仔细看按钮里的文本: Send,也就是实际渲染后是 Send(前面带一个不换行空格),而buttonText是精确匹配文本内容的,直接写'Send'自然匹配不到。试试这两种办法:
- 用
partialButtonText匹配包含"Send"的文本,不管前面的空格:var buttonsend = element(by.partialButtonText('Send')); buttonsend.click(); - 或者直接精确匹配带空格的文本(
\u00A0是 的Unicode编码):var buttonsend = element(by.buttonText('\u00A0Send')); buttonsend.click();
2. 按钮可能处于禁用状态
HTML里有ng-disabled="disabled",如果页面上的disabled变量是true,按钮就是灰的点不动。这时候得先等按钮变成可点击状态再操作:
// 先引入ExpectedConditions var EC = protractor.ExpectedConditions; var buttonsend = element(by.id('recover-credentials-submit')); // 最多等5秒,直到按钮可点击 browser.wait(EC.elementToBeClickable(buttonsend), 5000); buttonsend.click();
3. 换个更靠谱的定位器(比如ID)
按钮有唯一的id="recover-credentials-submit",用ID定位比文本定位稳定多了——毕竟文本可能改,但ID一般不会随便动:
var EC = protractor.ExpectedConditions; var buttonsend = element(by.id('recover-credentials-submit')); browser.wait(EC.elementToBeClickable(buttonsend), 5000); buttonsend.click();
4. 按钮可能在视口外,需要先滚动到可见
如果按钮在页面底部,浏览器没滚动到那里的话,点击也会失效。可以先把元素滚到视野里:
var EC = protractor.ExpectedConditions; var buttonsend = element(by.id('recover-credentials-submit')); // 执行JS滚动到元素可见 browser.executeScript("arguments[0].scrollIntoView();", buttonsend.getWebElement()); browser.wait(EC.elementToBeClickable(buttonsend), 5000); buttonsend.click();
建议你先试试用ID定位加等待可点击的方案,这个成功率最高。要是还是不行,可以用element.all(by.buttonText('Send')).count()看看页面上有多少个匹配的按钮,会不会是定位到了其他同名元素哦~
内容的提问来源于stack exchange,提问作者alex shr




