Protractor页面对象模型同步错误及退出码1问题排查请求
先帮你梳理下遇到的核心错误:
Process exited with error code 1
Failed: Error while waiting for Protractor to sync with the page: "both angularJS testability and angular testability are undefined..."
用普通测试脚本能跑通,但换POM就报错,问题主要出在两处,我给你拆解并修正:
1. 拼写错误导致同步逻辑失效
你在POM的get方法里写了browser.ignoreSyncronization=true;——这里少了个字母h!正确的属性名是ignoreSynchronization。这个拼写错误会让Protractor依然尝试和Angular页面做同步,但你的页面是非Angular的,自然触发了同步失败的报错。
2. 元素提前初始化导致找不到元素
你的POM一开始就直接定义了var NameInput = element(by.id('userNameInput'));这类元素变量,这时候页面还没加载,Protractor根本找不到这些元素,后续调用setName、setPassword时就会抛出元素不存在的错误,最终导致进程退出码1。
修正后的页面对象模型代码
我把这两个问题都修复了,还优化了等待逻辑(用ExpectedConditions替代硬sleep,更稳定可靠):
var CAPTNLoginpage = function(){ // 改成函数返回元素,避免页面未加载时提前初始化 this.getNameInput = function() { return element(by.id('userNameInput')); }; this.getPasswordInput = function() { return element(by.id('passwordInput')); }; this.getSubmitButton = function() { return element(by.id('submitButton')); }; this.get=function(){ browser.get('https://xxxxxxxx/', 25000); // 修正拼写错误,关闭Angular同步 browser.ignoreSynchronization = true; // 用wait等待页面标题加载完成,替代硬sleep browser.wait(function() { return browser.getTitle().then(function(title) { console.log(title); return true; }); }, 10000); }; this.setName = function(name){ // 等待元素可见后再操作 browser.wait(EC.visibilityOf(this.getNameInput()), 5000); this.getNameInput().sendKeys(name); }; this.setPassword = function(password){ browser.wait(EC.visibilityOf(this.getPasswordInput()), 5000); this.getPasswordInput().sendKeys(password); }; this.loginsubmit=function(){ // 等待按钮可点击后再点击 browser.wait(EC.elementToBeClickable(this.getSubmitButton()), 5000); this.getSubmitButton().click(); }; }; // 引入Protractor的预期条件工具类 var EC = protractor.ExpectedConditions; module.exports = new CAPTNLoginpage();
测试用例代码无需修改
你的POM版测试用例可以保持原样,核心问题都在POM里解决了:
var CAPTNLogin = require('./CAPTNLoginpage'); describe('CAPTN Login Page', function(){ it('Should login into CAPTN',function(){ CAPTNLogin.get(); CAPTNLogin.setName('xxxxxxxxxxx'); CAPTNLogin.setPassword('5196qL25196qL2'); CAPTNLogin.loginsubmit(); }); });
为什么普通写法能正常运行?
普通脚本里ignoreSynchronization拼写正确,而且是在页面加载完成后才去定位元素,避开了“提前初始化元素”和“同步逻辑失效”这两个坑,所以能正常执行。
内容的提问来源于stack exchange,提问作者Dixit_Autobot




