使用Safari中的WebDriver进行测试

启用WebDriver并运行测试。

概述 本文将指导您完成设置WebDriver和运行用Python编写的测试的过程。当测试调用一个命令时,该命令按照以下步骤执行:

  • 客户端库将每个命令翻译成REST API命令。
  • REST API命令向Safari的驱动程序托管的本地web服务器发送相应的HTTP请求。
  • 驱动程序验证HTTP请求的内容并将命令转发给适当的浏览器实例。
  • 当命令执行完毕后,驱动程序为REST API命令发送一个HTTP响应。客户端库解释HTTP响应并将结果返回给测试代码。

确保您有Safari的WebDriver Safari和Safari技术预览版各提供一个自己的safaridriver可执行文件。确保您的设备上已经有了这个可执行文件:

  • Safari的可执行文件位于/usr/bin/safaridriver。
  • Safari技术预览版的可执行文件是应用程序包内容的一部分。

每个safaridriver只能启动与其关联的Safari版本,并且两者可以同时运行。尽管您可以通过运行safaridriver可执行文件来手动启动safaridriver,但大多数Selenium库会自动启动驱动程序。请参阅您首选客户端库的文档以了解如何指定要使用的浏览器。

获取正确的Selenium库版本 获取Selenium开源项目的最近发布版本。从3.0.0-beta1版本开始,Selenium的Java和Python客户端库提供对Safari的原生驱动实现的支持。

重要

不要使用旧的SafariDriver实现,它不再受Selenium项目支持。由Apple开发的驱动程序是Selenium项目之前维护的旧版SafariDriver的替代品。

配置Safari以启用WebDriver支持 默认情况下,Safari对开发者的WebDriver支持是关闭的。启用方式取决于您的操作系统。

High Sierra及更高版本:

运行一次。(如果您是从以前的macOS版本升级,可能需要使用sudo。)

bash 复制代码
safaridriver --enable

Sierra及更早版本:

如果尚未这样做,请使Develop菜单可用。

  • 选择Safari > Preferences,在Advanced标签页中,选择"在菜单栏中显示Develop菜单"。有关详细信息,请参阅Safari帮助。
  • 选择Develop > Allow Remote Automation。

授权safaridriver启动托管本地web服务器的XPC服务。为此,手动运行一次,并遵循认证提示。

bash 复制代码
/usr/bin/safaridriver

编写WebDriver测试套件 一旦您获得了客户端库,就可以编写WebDriver测试并在Safari上运行。下面的示例使用Python WebDriver测试WebKit功能状态页面的重要功能。

注意

在Python WebDriver库中,每个方法调用同步阻塞进程,直到操作完成。其他WebDriver库可能提供异步API。

python 复制代码
#coding: utf-8 
from selenium.webdriver.common.by import By 
from selenium import webdriver
import unittest 
import time

def setup_module(module): 
    WebKitFeatureStatusTest.driver = webdriver.Safari()

def teardown_module(module): 
    WebKitFeatureStatusTest.driver.quit()

class WebKitFeatureStatusTest(unittest.TestCase):

    def test_feature_status_page_search(self):
        self.driver.get("https://webkit.org/status/")
        
        # 在搜索框中输入"CSS"。
        # 确保至少有一个结果出现在搜索中
        search_box = self.driver.find_element_by_id("search")
        search_box.send_keys("CSS")
        value = search_box.get_attribute("value")
        self.assertTrue(len(value) > 0)
        search_box.submit()
        time.sleep(1)
        # 计算应用过滤器后可见结果的数量
        # 以便最多只有一个结果出现在一个过滤器中
        feature_count = self.shown_feature_count()
        self.assertTrue(feature_count > 0)
    
    def test_feature_status_page_filters(self):
        self.driver.get("https://webkit.org/status/")
        
        time.sleep(1)
        filters = self.driver.execute_script("return document.querySelectorAll('.filter-toggle')")
        self.assertTrue(len(filters) is 7)
    
        # 确保每个过滤器都是关闭的。
        for checked_filter in filter(lambda f: f.is_selected(), filters):
            checked_filter.click()
    
        # 确保您可以选择每个过滤器。
        for filt in filters:
            filt.click()
            self.assertTrue(filt.is_selected())
            filt.click()

    def shown_feature_count(self):
        return len(self.driver.execute_script("return document.querySelectorAll('li.feature:not(.is-hidden)')"))


if name == "main":
 unittest.main() 

运行您的测试 将上面的测试代码复制并保存为test_webkit.py,然后运行以下命令:

python test_webkit.py

相关推荐
寅时码2 小时前
React 之死·终章:一个 useRef,把闭包陷阱、依赖数组、漫天 rerender 全送走
前端·react.js·ai编程
不好听6132 小时前
HTML 事件监听机制:从 DOM Level 0 到 React 合成事件
前端·react.js·html
wordbaby2 小时前
为什么刷新页面就 404?聊聊 SPA 路由与 Nginx 的那点事
前端
不好听6132 小时前
React 核心概念:JSX、组件与数据驱动
前端·react.js
触底反弹2 小时前
🔥 React 零基础入门(中):500 行屎山代码到组件化的蜕变
前端·javascript·react.js
不好听6132 小时前
React vs Vue:两大前端框架技术选型深度对比
前端·vue.js·react.js
GuWenyue2 小时前
Cursor黑盒拆解!1套LangChain.js手写Mini编程Agent,自动生成React项目,效率提升60%
前端·数据库·人工智能
GuWenyue2 小时前
传统Agent工具两大痛点!300行代码落地MCP跨语言工具,彻底解耦LLM与工具
前端·人工智能·算法
小林ixn3 小时前
从 onclick 到 React 合成事件,再到完整应用逻辑:一次前端架构的深度剖析
前端·react.js·前端框架
Csvn4 小时前
🧩「找不到模块」排查全记录——Monorepo 下 TypeScript 路径别名的 5 种「不通」与根治方案
前端