You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Protractor页面对象模型同步错误及退出码1问题排查请求

解决Protractor页面对象模型(POM)中的同步错误问题

先帮你梳理下遇到的核心错误:

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根本找不到这些元素,后续调用setNamesetPassword时就会抛出元素不存在的错误,最终导致进程退出码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

火山引擎 最新活动