Protractor问题:如何让测试用例等待认证完成
解决方案:Protractor认证跳转后同步失败问题
这种在认证跳转过程中测试提前执行、导致Angular同步报错的情况,我在实际项目里碰到过好多次,给你几个实用的解决思路:
1. 强制等待跳转回应用首页再执行测试
核心思路是确保页面完全回到你的Angular应用URL后,再启动测试逻辑,避免Protractor在非Angular的认证页面上尝试同步。示例代码:
// 加载应用初始URL browser.get('app url'); // (可选)先确认跳转到了认证页面,确保流程正常 browser.wait(() => { return browser.getCurrentUrl().then(url => url.includes('你的认证页面关键词')); }, 10000, '等待跳转至认证页面超时'); // 执行认证操作(输入用户名、密码、点击登录) element(by.id('username')).sendKeys('你的用户名'); element(by.id('password')).sendKeys('你的密码'); element(by.id('login-btn')).click(); // 关键步骤:等待页面跳转回应用首页 browser.wait(() => { return browser.getCurrentUrl().then(url => url === 'app url'); }, 10000, '等待返回应用首页超时'); // 现在再执行你的测试用例,就不会出现同步问题了
2. 临时禁用Protractor的Angular同步
因为认证页面通常是非Angular的,Protractor默认的Angular同步机制会在这里失效报错。我们可以在处理认证流程时关闭同步,回到Angular应用后再开启:
// 关闭Angular同步,处理非Angular的认证页面 browser.waitForAngularEnabled(false); browser.get('app url'); // 完成所有认证操作 element(by.css('#auth-form input[name="user"]')).sendKeys('user'); element(by.css('#auth-form input[name="pass"]')).sendKeys('pass'); element(by.css('#auth-submit')).click(); // 等待回到应用首页 browser.wait(() => { return browser.getCurrentUrl().then(url => url === 'app url'); }, 10000); // 重新启用Angular同步,恢复Protractor的正常工作模式 browser.waitForAngularEnabled(true); // 接下来的测试用例就能正常和Angular应用同步了
3. 等待Angular完全初始化完成
有时候即使回到了应用URL,Angular可能还在加载初始化,这时候可以直接等待Angular就绪,或者等待页面上某个核心元素出现:
// 回到应用首页后,等待Angular完全初始化 browser.waitForAngular(); // 或者更稳妥:等待首页的标志性元素(比如导航栏、logo)出现 const EC = protractor.ExpectedConditions; browser.wait(EC.presenceOf(element(by.css('.app-main-nav'))), 10000, '等待首页核心元素加载超时');
为什么会出现这个报错?
你看到的both angularJS testability and angular testability are undefined错误,本质是:
- 认证跳转过程中,Protractor在非Angular页面上尝试等待Angular同步,但这些页面没有加载Angular框架,所以同步机制失效;
- 测试用例没有等待跳转完成就开始执行,导致代码在错误的页面环境下运行。
把上面的方法结合起来用,基本能解决这类认证流程导致的同步问题。
内容的提问来源于stack exchange,提问作者Maddy
相关产品推荐
相关产品推荐

