Angular5项目中Protractor E2E测试登录Google账号时卡顿超时
我之前在处理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

