WebDriver 将登陆 iOS 13 上的 Safari
任何开发过移动友好型网站的人都会告诉你,移动浏览器和桌面浏览器是不同的。随着设备功能的不断发展,以及用户将更多的浏览活动转移到移动浏览器上,Web 开发者面临着越来越大的需求,需要像测试桌面端网站内容一样,为移动 Web 编写自动化测试。
从 iOS 13 开始,Safari 现在原生支持 W3C WebDriver 标准。此功能建立在桌面版 Safari 现有 WebDriver 支持的基础上,后者首次在 Safari 10 和 macOS Sierra 中引入。这篇博文将解释如何开始使用适用于 iOS 的 WebDriver,如何移植现有桌面端测试,以及一些有关安全措施和行为变更的详细信息。
开始使用
通过 WebDriver 进行控制是通过 /usr/bin/safaridriver
可执行文件向开发者公开的,该文件托管一个驱动程序,负责处理 WebDriver 测试客户端发送的 REST API 请求。要在 iOS 设备上运行 WebDriver 测试,该设备必须连接到运行足够新版本 safaridriver 的 macOS 主机。Safari 13 及更高版本中包含的 safaridriver 支持托管基于 iOS 的 WebDriver 会话。旧版本的 safaridriver 不支持 iOS WebDriver 会话。
如果您之前从未在 macOS 上使用过 safaridriver,您首先需要运行 safaridriver --enable
并以管理员身份进行身份验证。然后,您必须在您打算用于 WebDriver 的每台设备上启用远程自动化。为此,请在“设置”→“Safari”→“高级”→“远程自动化”中切换此设置。

最后,要在设备上运行测试,您需要将其插入 macOS 机器,信任主机,并确保在尝试启动 WebDriver 会话时设备处于解锁状态。
由于 safaridriver 能够使用 macOS 主机上的 Safari 或连接的 iOS 设备上的 Safari 启动 WebDriver 会话,因此它需要额外的提示来识别您是想使用设备还是桌面机器。为了方便这一点,safaridriver 支持许多可以在新会话请求中提供的新功能。最重要的一个新功能是 **‘platformName’: ‘ios’;**;这告诉驱动程序您想要一个 iOS 主机而不是 macOS 主机。您还可以通过指定设备类型、设备 UDID、设备名称、操作系统版本、操作系统构建版本和浏览器版本,通过标准化和扩展功能来指定您希望使用的主机。最后,safaridriver 支持在运行时为 iOS 13 或更高版本的 iOS 模拟器设备上运行 WebDriver 测试。要使用模拟器进行测试,请添加功能 **‘safari:useSimulator’: true**。有关支持的功能及其语义的完整列表,请通过执行 man safaridriver
命令查阅 safaridriver(1) 手册页。
安全措施
尽管能够编写在 Safari 中运行的自动化测试非常棒,但用于浏览器自动化的 REST API 也为恶意软件引入了潜在途径。为了在不牺牲用户隐私或安全的情况下支持有价值的自动化 API,Safari 的驱动程序实现引入了额外的安全措施,进一步限制了 WebDriver 会话中的浏览。这些安全措施通过提供增强的测试隔离,也充当了防止“不稳定测试”的额外保障。下面描述了其中一些安全措施。
就像在 macOS 上一样,iOS 上的 Safari 通过使用独立的窗口、标签页、偏好设置和持久存储来隔离 WebDriver 测试。当 WebDriver 会话处于活动状态时,现有标签页会被隐藏,取而代之的是一个颜色独特的 WebDriver 窗口。自动化窗口很容易通过其橙色的智能搜索栏识别。类似于在无痕浏览窗口中浏览,在自动化窗口中运行的 WebDriver 测试总是从一个干净的状态开始,并且无法访问 Safari 的正常浏览历史、自动填充数据或其他敏感信息。除了显而易见的隐私优势外,此限制还有助于确保测试不受先前测试会话的持久状态(例如本地存储或 Cookie)的影响。当 WebDriver 会话终止时,橙色窗口会消失,先前存在的标签页会恢复,并且在 WebDriver 会话期间积累的任何状态都会被销毁。
当 WebDriver 测试在自动化窗口中执行时,任何与窗口或网页内容交互的尝试都可能通过意外改变页面状态而使测试偏离轨道。为防止这种情况发生,Safari 在测试运行时会在自动化窗口上方安装一个“玻璃窗格”。这会阻止任何意外的交互(鼠标、键盘、调整大小等)影响自动化窗口。如果正在运行的测试卡住或失败,可以通过点击屏幕并选择结束会话来中断正在运行的测试。当自动化会话被中断时,测试与浏览器的连接将永久断开,无法恢复。在 WebDriver 测试运行期间,通知和系统手势(即,从顶部/底部滑入)也会被抑制,以避免不稳定。

本次发布并非旨在通过 WebDriver API 支持通用设备自动化。W3C WebDriver API 专注于自动化与网页内容的交互,这也是 iOS 13 中添加的 WebDriver 支持的重点。存在其他方式可以使用 XCTest Framework 更改系统级配置,并且它们与 WebDriver 互补。网页内容与 iOS 其他部分交互的方式还有很多,其中大多数都被抑制,以提供稳定的测试环境。iOS 版 Safari 不允许 WebDriver 启动的导航在 Safari 外部处理。换句话说,点击 tel://
链接不会提供拨打电话的选项,点击 App Store 链接也不会将用户重定向到 App Store。同样,当 WebDriver 会话处于活动状态时,系统显示非 Safari 内容(例如更新对话框、应用通知、来电等)也会被抑制。最后,在 WebDriver 会话中聚焦文本字段时,软键盘会被抑制。要使用 WebDriver 模拟文本输入,请使用现有的 Perform Actions 接口 或 Element Send Keys 接口。
移植测试
iOS 13 的一个主要目标是让在移动设备上开发和使用桌面级网页体验变得更容易。为此,iOS 上的 WebDriver 的一个主要目标是让现有桌面端 WebDriver 测试能够轻松移植,以在 iPadOS 上的 Safari 中配合桌面级浏览。尽管我们希望在测试中将 macOS 和 iOS 设备一视同仁,但仍存在重要的差异,这些差异会影响您可能如何使用 WebDriver。
第一个显著的区别是用户输入的处理,即触摸和点击。在 iOS 上 WebDriver 的这个初始版本中,模拟输入源包括键盘、鼠标和单指触摸。Perform Actions 命令和 Element Click 命令使用鼠标输入来合成触摸。如果您现有的测试使用鼠标点击、双击和拖动,safaridriver 会将这些交互转换为等效的单指触摸;无需更改代码。此版本不支持多点触控输入源(即多指)。我们尝试通过现有的 Perform Actions 接口提供此功能,但发现很难编写能够执行熟知手势(例如轻拂、捏合、平移等)的 WebDriver 命令。这部分是由于 Actions API 的低级特性,部分是由于 Safari 和 WebKit 使用的手势识别器的时序敏感特性。Apple 正在 W3C WebDriver 工作组内努力定义一个更具表现力、直观且稳定的 API,用于在 WebDriver 测试中执行手势。
macOS 和 iOS WebDriver 之间一个不太令人惊讶的区别是,用于操纵操作系统窗口的接口通常不受 iOS 上的 Safari 支持。具体来说,Set Window Rect、Minimize Window 和 Maximize Window 接口将返回 “不支持的操作”。有关支持哪些接口的更详细信息,请参阅 W3C WebDriver 命令参考。
总结
随着 iOS 13 中 Safari 对 WebDriver 原生支持的引入,现在可以在桌面和移动设备上平等地运行相同的桌面端网页内容自动化测试。Safari 的支持带来了新的独家安全措施,可同时保护用户安全和隐私,并帮助您编写更稳定、更一致的测试。您可以通过安装 macOS Catalina 和 iOS 13 的 Beta 版本来立即试用 Safari 的 WebDriver 支持。
如果您在使用 Safari 的 WebDriver 支持时遇到意外行为,或有其他改进建议,请在 https://bugreport.apple.com/ 提交错误报告。如需快速提问或反馈,请发送电子邮件至 web-evangelist@apple.com 或在 Twitter 上发推文给 @webkit。测试愉快!