在login.microsoftonline过程中,执行「切换Edge配置文件」后,Playwright(Edge)失败(目标页面已关闭)
正文
我正在为一个需要Microsoft身份验证(M365 + MFA)的公司内部门户设置基础的Playwright测试。
目标
我的目标是:
- 仅在有头模式下运行一次测试
- 手动登录
- 使用storageState持久化会话
- 在无头测试中复用该会话
问题
在运行设置测试时,并非直接进入门户,而是被重定向到Microsoft登录流程。
由于公司策略:
- 必须使用Microsoft Edge(非Chromium)
- 必须使用我的工作Edge配置文件
- 不允许匿名或非配置文件访问
在登录过程中,Microsoft会显示一个强制性的“切换Edge配置文件”的步骤。
在输入凭据后:
- 我点击“切换Edge配置文件”
- 当前浏览器窗口关闭
- Playwright抛出:
Error: page.waitForURL: Target page, context or browser has been closed
发生在:
await page.waitForURL('https://awesome-website.com');
从日志中:
waiting for navigation to 'https://awesome-website.com' until "load"
因此,失败似乎是由配置文件切换导致受控页面/上下文被关闭。
最小可复现示例
设置测试
// tests/auth.setup.ts
import { test as setup } from '@playwright/test';
import path from 'path';
const authFile = path.join(__dirname, '../playwright/.auth/user.json');
setup('manual authenticate', async ({ page }) => {
await page.goto('https://awesome-website.com/');
await page.pause(); // manually log in, then click "Switch Edge profile"
await page.context().storageState({ path: authFile });
});
Playwright配置
import { defineConfig, devices } from '@playwright/test';
const baseUrl = 'https://awesome-website.com/';
const AUTH_FILE = 'playwright/.auth/user.json';
export default defineConfig({
testDir: './playwright-tests',
timeout: 300_000,
reporter: 'html',
use: {
baseURL: baseUrl,
trace: 'on-first-retry',
},
projects: [
{
name: 'setup',
testMatch: /.*\.setup\.ts/,
use: {
...devices['Desktop Edge'],
channel: 'msedge',
headless: false,
},
},
{
name: 'edge',
use: {
...devices['Desktop Edge'],
storageState: AUTH_FILE,
},
dependencies: ['setup'],
},
],
});
额外发现
- 当点击“切换Edge配置文件”时,失败会发生,此操作会关闭当前浏览器实例。
- Playwright随后失去对页面/上下文的控制。
- 我无法稳定地自动化点击该按钮。
- 我还尝试使用带有现有Edge配置文件的持久上下文(在edge://version中找到),但结果失败:
browserType.launchPersistentContext: Target page, context or browser has been closed
相关日志摘录:
<launched> pid=63536
<gracefully close start>
<kill>
<will force kill>
taskkill stderr: ERROR: The process "63536" not found.
<process did exit: exitCode=21>
这表明使用现有的工作配置文件启动Edge可能被阻止或终止(很可能是由于企业安全策略)。
约束
- 必须使用Microsoft Edge
- 必须使用工作配置文件
- 不能创建带工作凭据的新配置文件
- 不能绕过对配置文件的强制执行
- 不能禁用MFA或登录流程
问题
我应该如何:
- 防止“切换Edge配置文件”步骤破坏Playwright?
或者
- 直接使用正确的Edge工作配置文件启动Playwright?
或者
- 以可靠的方式在此场景中持久化认证?
其他内部仓库似乎通过使用无头认证流程来避免这个问题(例如通过Microsoft端点获取令牌),而不是UI登录。
如果可能,我更倾向于UI驱动的方法,但如果从根本上与Playwright + Edge配置文件不兼容,我也愿意接受替代方案。
这是发生情况的截图。完成Microsoft M365登录并获取重定向链接后,我会看到这个弹出窗口(我无法以编程方式点击),当我同意切换时,页面关闭,测试就会按上述错误失败。
解决方案
通过将设置指向 login.microsoftonline.com/<instance><tenantId>,问题得到解决。
我建议先尝试手动登录一次,看看这些ID在 URL参数中是如何传递的,然后把它们作为环境变量传递即可。
