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

Angular5项目中Protractor E2E测试登录Google账号时卡顿超时

解决Protractor E2E测试中谷歌登录跳转SetSID空白页超时的问题

我之前在处理Angular应用的Protractor E2E测试时,也遇到过几乎一模一样的问题——自动化登录谷歌账号时卡在https://accounts.google.de/accounts/SetSID空白页超时,但手动操作完全正常。结合排查经验,给你几个靠谱的解决方案:

1. 禁用Protractor的Angular等待机制

谷歌登录页面是非Angular应用,而Protractor默认会等待页面中的Angular框架稳定后再继续执行后续步骤。这就导致跳转到谷歌登录页后,Protractor一直在等待不存在的Angular,最终触发超时。

解决步骤很简单:

  • 在进入谷歌登录流程前,执行browser.waitForAngularEnabled(false);禁用Angular等待
  • 登录完成跳转回你的Angular应用后,再执行browser.waitForAngularEnabled(true);恢复默认设置

示例代码片段:

it('完成谷歌账号登录', async () => {
  // 禁用Angular等待,适配谷歌非Angular登录页
  await browser.waitForAngularEnabled(false);

  // 点击谷歌登录按钮
  await element(by.css('.google-login-btn')).click();

  // 输入账号并点击下一步
  await browser.wait(ExpectedConditions.visibilityOf(element(by.id('identifierId'))), 8000);
  await element(by.id('identifierId')).sendKeys('test-account@gmail.com');
  await element(by.id('identifierNext')).click();

  // 输入密码并点击下一步
  await browser.wait(ExpectedConditions.visibilityOf(element(by.css('input[type="password"]'))), 8000);
  await element(by.css('input[type="password"]')).sendKeys('your-password');
  await element(by.id('passwordNext')).click();

  // 等待跳转到你的应用目标页面(替换成实际URL)
  await browser.wait(ExpectedConditions.urlContains('https://your-app-domain.com/home'), 15000);

  // 恢复Angular等待,继续后续Angular应用的测试
  await browser.waitForAngularEnabled(true);

  // 后续测试逻辑...
});

2. 配置ChromeOptions规避谷歌自动化检测

ChromeDriver默认会给浏览器打上"自动化环境"的标记,谷歌的账号系统可能会针对自动化环境调整跳转逻辑,导致卡在SetSID页面。我们可以通过Chrome参数禁用这个标记:

在protractor.conf.js中添加以下配置:

exports.config = {
  // 其他配置项...
  capabilities: {
    browserName: 'chrome',
    chromeOptions: {
      args: [
        '--disable-blink-features=AutomationControlled', // 禁用自动化检测标记
        '--disable-extensions', // 禁用浏览器扩展,减少干扰
        '--no-sandbox' // Linux环境下运行可能需要,避免权限问题
      ]
    }
  },
  // 其他配置项...
};

这个配置能让Chrome在自动化测试中更接近手动操作的环境,大概率能解决跳转异常的问题。

3. 优化等待策略,不要依赖页面加载完成事件

有时候页面的load事件已经触发,但实际跳转还没完成。这时候不要依赖默认的页面加载等待,而是显式等待目标URL出现或者目标页面的元素可见,就像上面示例中用browser.wait(ExpectedConditions.urlContains(...))的方式,比默认等待更可靠。

手动操作没问题的核心原因是:手动操作时浏览器不会被标记为自动化环境,且没有Protractor的Angular等待逻辑干扰,谷歌的跳转流程能正常完成;而自动化测试中这两个因素都存在,才导致了差异。

内容的提问来源于stack exchange,提问作者Anton Poznyakovskiy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:16:17