Protractor报错:Cannot read property 'bind' of undefined 问题求助
解决Protractor中"Cannot read property 'bind' of undefined"报错问题
咱们一步步拆解你的问题,先理清报错根源,再给出具体修复方案:
报错原因分析
你遇到的Cannot read property 'bind' of undefined,主要是两个核心问题导致的:
- 你的
popupToastIP函数里,element.all(...).then()的回调没有返回任何值,整个函数执行后默认返回undefined。你后续尝试给这个undefined调用.bind(this),自然会报错——因为undefined根本没有bind方法。而且你把bind加在then()后面的位置也不对,应该是给then的回调函数绑定this,而非给then的返回值绑定。 - 测试用例的写法也存在逻辑错误:
browser.wait(EC.visibilityOf(publisher_whitelist_page.popupToastIP),5000)中,popupToastIP是一个函数,但EC.visibilityOf需要接收的是ElementFinder(元素定位器),不是函数,这直接导致后续逻辑走不通。另外expect里的写法也错了,你既没有调用函数,原函数也没返回要断言的文本值。
修复后的代码方案
第一步:重构Page Object类
我们把元素定位和文本获取逻辑拆分,让代码更清晰,符合Protractor的最佳实践:
// 直接定位单个toast元素(从需求看页面应该只有一个成功提示toast,无需element.all) this.popupToastIPElement = element(by.className('toast-success toast ng-trigger ng-trigger-flyInOut')); // 定义获取toast文本的方法,直接返回getText的Promise this.getPopupToastIPText = function() { return this.popupToastIPElement.getText(); };
这么改的原因:
- 去掉
element.all:避免不必要的元素列表遍历,直接定位目标元素更高效。 - 直接返回
getText():Protractor会自动处理Promise,测试用例里可以直接用expect断言,无需手动写then嵌套。
第二步:修正测试用例
// 等待toast元素可见,传入正确的ElementFinder browser.wait(EC.visibilityOf(publisher_whitelist_page.popupToastIPElement), 5000); // 调用文本获取方法,断言内容是否符合预期 expect(publisher_whitelist_page.getPopupToastIPText()).toEqual('Ip address removed');
额外小提示
- 尽量避免在Page Object里写冗余的
then嵌套,Protractor的API已经封装了Promise处理,直接返回元素或Promise即可。 - Page Object的设计要清晰:把元素定位、操作方法、数据获取方法分开,能大幅提升测试用例的可读性。
- 使用
ExpectedConditions时,一定要传入正确的参数类型(比如visibilityOf必须传ElementFinder),不然很容易出现奇怪的报错。
内容的提问来源于stack exchange,提问作者Kirsty Meredith
相关产品推荐
相关产品推荐

