restartBrowserBetweenTests与onPrepare()冲突问题及执行时机咨询
问题解决:非Angular应用多Spec运行报错与onPrepare执行机制解析
一、报错原因与解决方案
你遇到的报错核心原因是:restartBrowserBetweenTests: true会在每个测试前后重启浏览器,但onPrepare()只会在所有测试启动前执行一次。第一次运行spec时,你通过browser.waitForAngularEnabled(false)关闭了Angular检测,但浏览器重启后,这个配置会被重置,第二个spec运行时Protractor又会默认等待Angular,所以抛出了找不到Angular的错误。
解决这个问题有两种可靠的方式:
方式1:在每个Spec的前置钩子中添加配置
在每个spec文件的beforeAll或beforeEach里重新设置browser.waitForAngularEnabled(false),确保每次浏览器启动后都生效:
// app.1.js 和 app.2.js 都添加这段 describe('xxx test', () => { beforeAll(() => { browser.waitForAngularEnabled(false); }); it('should check is displayed successfully', () => { browser.driver.get("https://stackoverflow.com"); browser.driver.sleep(5000); expect(element(by.linkText('Ask Question')).isDisplayed()).toBe(true); }); });
方式2:使用Protractor的onBrowserRestart钩子(推荐)
如果你的Protractor版本支持,在conf.js里添加onBrowserRestart钩子,每次浏览器重启后自动执行配置:
exports.config = { // 其他配置... restartBrowserBetweenTests: true, onPrepare:function(){ browser.waitForAngularEnabled(false); }, onBrowserRestart: () => { // 每次浏览器重启后重新关闭Angular等待 browser.waitForAngularEnabled(false); } }
二、onPrepare()的执行机制
划重点:onPrepare()仅在所有测试启动前执行一次,不管你是否开启restartBrowserBetweenTests。它的作用是在Protractor初始化完成、浏览器启动之前,做一些全局的准备工作(比如注册Babel、添加报告器)。但一旦浏览器重启,之前通过browser对象设置的配置(比如waitForAngularEnabled)会随着旧浏览器实例销毁而丢失,新的浏览器实例会恢复默认配置,这就是你第二个spec报错的根本原因。
你的原始配置与可复现代码
conf.js
exports.config = { framework: 'jasmine', specs: ['./app.1.js', './app.2.js'], seleniumAddress: 'http://localhost:4444/wd/hub', restartBrowserBetweenTests:true, onPrepare:function(){ browser.waitForAngularEnabled(false); }, }
app.1.js
describe('second test', () => { it('should check is displayed successfully', () => { browser.driver.get("https://stackoverflow.com"); browser.driver.sleep(5000); expect(element(by.linkText('Ask Question')).isDisplayed()).toBe(true); }); });
app.2.js
describe('first test', () => { it('should check is displayed successfully', () => { browser.driver.get("https://stackoverflow.com"); browser.driver.sleep(5000); expect(element(by.linkText('Ask Question')).isDisplayed()).toBe(true); }); });
内容的提问来源于stack exchange,提问作者RedVarVar
相关产品推荐
相关产品推荐

