如何在Mac端基于C#后端运行Playwright Safari自动化测试
迁移Mac/Safari Selenium远程测试到Playwright(C#/Reqnroll/MSTest)
一、Mac Mini端准备
先在你的Mac Mini上配置Playwright Server,替代原有的Selenium Server:
- 安装Node.js(要求版本16及以上)
- 全局安装Playwright:
npm install -g playwright - 安装Safari对应的Playwright驱动:
playwright install safari - 启用Safari远程自动化:打开Safari偏好设置→高级→勾选「显示开发菜单」,再在顶部菜单「开发」中选择「允许远程自动化」
- 启动Playwright Server,允许外部设备访问:
playwright server --host 0.0.0.0 --port 4444
二、Windows端测试代码改造
替换原有的Selenium RemoteWebDriver逻辑,改用Playwright的远程连接方案:
1. 依赖准备
确保测试项目已安装以下NuGet包:
Microsoft.PlaywrightReqnrollMSTest.TestFramework和MSTest.TestAdapter
2. 替换Driver定义
把原有的RemoteWebDriver替换为Playwright核心对象:
using Microsoft.Playwright; using Reqnroll; using Microsoft.VisualStudio.TestTools.UnitTesting; [TestClass] [Binding] public class Hooks { protected static IPlaywright Playwright { get; set; } protected static IBrowser Browser { get; set; } protected static IPage Page { get; set; } private readonly string _macMiniWsEndpoint = "ws://00.000.0.00:4444/playwright/safari"; // 替换为你的Mac Mini实际IP
3. 修改BeforeScenario逻辑
替换原Selenium初始化代码为Playwright远程连接逻辑:
[BeforeScenario] public async Task BeforeScenario() { // 初始化Playwright实例 Playwright = await Playwright.CreateAsync(); // 连接到Mac Mini上的Playwright Server Browser = await Playwright.Safari.ConnectAsync(new BrowserConnectOptions { WsEndpoint = _macMiniWsEndpoint }); // 创建最大化窗口的页面(对应原Selenium的窗口最大化操作) Page = await Browser.NewPageAsync(new BrowserNewPageOptions { Args = new[] { "--start-maximized" }, // 匹配原Selenium的PageLoadStrategy.Normal,对应Playwright的Load状态 DefaultNavigationWaitUntil = WaitUntilState.Load }); }
4. 添加AfterScenario清理逻辑
测试结束后释放Playwright资源:
[AfterScenario] public async Task AfterScenario() { await Page.CloseAsync(); await Browser.CloseAsync(); Playwright.Dispose(); }
关键注意事项
- Playwright使用WebSocket连接远程Server,端点格式为
ws://<mac-ip>:<port>/playwright/safari,和Selenium的HTTP端点格式不同 - 确保Mac Mini的防火墙允许4444端口的WebSocket流量
- 若需单独调整某个页面的加载策略,可在
Page.GotoAsync时通过WaitUntil参数指定,例如:await Page.GotoAsync("https://your-test-url.com", new PageGotoOptions { WaitUntil = WaitUntilState.Load });
内容的提问来源于stack exchange,提问作者Kev
相关产品推荐
相关产品推荐

