Protractor中click()函数失效问题咨询(无法修改现有代码)
这种情况我之前在项目里也碰到过几次,结合你的描述,主要有这几个可能的原因:
元素被遮挡导致Protractor无法触发有效点击
Protractor的click()方法会严格遵循浏览器的交互规则,它会先检查元素是否处于可交互状态——比如是否被其他元素(哪怕是透明的遮罩、fixed定位的导航栏/弹窗)覆盖,是否在视口内等。如果有任何阻挡,click()就会静默失败。而browser.executeScript("arguments[0].click();", next)是直接调用元素的原生点击事件,不会检查这些交互前置条件,所以能成功触发。自定义事件绑定与Protractor的click机制不兼容
如果你的按钮用了前端框架(比如Angular、React)的自定义事件绑定,或者用了jQuery这类第三方库绑定点击逻辑,Protractor的click()可能无法正确触发这些自定义绑定的事件。原生JS的click()则是直接触发元素本身的click事件,不管事件是怎么绑定的,所以能绕开这个兼容性问题。Protractor的Angular同步机制干扰
Protractor默认会自动等待Angular的$http请求完成和$digest循环结束后才执行操作。如果这个按钮的点击逻辑脱离了Angular上下文(比如用原生JS实现跳转/加载),Protractor的click()可能因为一直在等待Angular同步,导致实际的点击操作没有被正确执行。而executeScript会直接执行JS代码,绕过Protractor的Angular同步机制,所以能正常工作。元素状态检测的差异
有时候按钮的disabled属性是动态设置的(比如视觉上看起来可用,但DOM里的disabled没及时更新),Protractor的click()会检测到元素处于禁用状态而不执行点击;但原生JS的click()不会管这个属性,直接触发点击事件,刚好匹配了前端实际的逻辑。
内容的提问来源于stack exchange,提问作者Shinoj Nambiar

