在login.microsoftonline过程中,执行「切换Edge配置文件」后,Playwright(Edge)失败(目标页面已关闭)

前端开发 2026-07-11

正文

我正在为一个需要Microsoft身份验证(M365 + MFA)的公司内部门户设置基础的Playwright测试。

目标

我的目标是:

  1. 仅在有头模式下运行一次测试
  2. 手动登录
  3. 使用storageState持久化会话
  4. 在无头测试中复用该会话

问题

在运行设置测试时,并非直接进入门户,而是被重定向到Microsoft登录流程。

由于公司策略:

  1. 必须使用Microsoft Edge(非Chromium)
  2. 必须使用我的工作Edge配置文件
  3. 不允许匿名或非配置文件访问

在登录过程中,Microsoft会显示一个强制性的“切换Edge配置文件”的步骤。

在输入凭据后:

  1. 我点击“切换Edge配置文件”
  2. 当前浏览器窗口关闭
  3. 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或登录流程

问题

我应该如何:

  1. 防止“切换Edge配置文件”步骤破坏Playwright?

或者

  1. 直接使用正确的Edge工作配置文件启动Playwright?

或者

  1. 以可靠的方式在此场景中持久化认证?

其他内部仓库似乎通过使用无头认证流程来避免这个问题(例如通过Microsoft端点获取令牌),而不是UI登录。

如果可能,我更倾向于UI驱动的方法,但如果从根本上与Playwright + Edge配置文件不兼容,我也愿意接受替代方案。

这是发生情况的截图。完成Microsoft M365登录并获取重定向链接后,我会看到这个弹出窗口(我无法以编程方式点击),当我同意切换时,页面关闭,测试就会按上述错误失败。

此处输入图片描述

解决方案

通过将设置指向 login.microsoftonline.com/<instance><tenantId>,问题得到解决。

我建议先尝试手动登录一次,看看这些ID在 URL参数中是如何传递的,然后把它们作为环境变量传递即可。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章