You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:51:04