自动化测试工具playwright中文文档-------18.模拟
简介
使用 Playwright,您可以在任何浏览器上测试您的应用程序,并模拟真实的设备,如手机或平板电脑。您只需配置想要模拟的设备,Playwright 就会模拟浏览器的行为,如“userAgent”(用户代理)、“screenSize”(屏幕尺寸)、“viewport”(视口)以及是否启用“hasTouch”(触摸功能)。此外,您还可以为所有测试或特定测试模拟“geolocation”(地理位置)、“locale”(区域设置)和“timezone”(时区),并设置“permissions”(权限)以显示通知或更改“colorScheme”(颜色方案)。
设备
Playwright 提供了一个设备参数注册表registry of device parameters,使用 playwright.devices来选择桌面、平板和移动设备。这可以用于模拟特定设备的浏览器行为,如用户代理(user agent)、屏幕尺寸(screen size)、视口(viewport)以及是否启用触摸功能(touch enabled)。所有测试都将使用指定的设备参数运行。
以下是一个使用 Playwright 同步 API 的示例代码,展示了如何模拟 iPhone 13 设备:
from playwright.sync_api import sync_playwright, Playwright def run(playwright: Playwright): # 从 Playwright 设备注册表中获取 iPhone 13 的参数 iphone_13 = playwright.devices['iPhone 13'] # 启动无头模式的 WebKit 浏览器(这里设置为非无头模式以便观察) browser = playwright.webkit.launch(headless=False) # 创建一个新的浏览器上下文,应用 iPhone 13 的设备参数 context = browser.new_context(**iphone_13) # 使用 sync_playwright 上下文管理器启动 Playwright 并运行测试
with sync_playwright() as playwright: run(playwright)
首先导入了必要的 Playwright 同步 API 模块。然后,定义了一个 run
函数,该函数接受一个 Playwright
实例作为参数。在函数内部,我们从 playwright.devices
字典中获取了 iPhone 13 的设备参数,并使用这些参数启动了一个 WebKit 浏览器实例(这里设置为非无头模式以便我们可以观察到浏览器行为)。接着,我们基于这些设备参数创建了一个新的浏览器上下文。最后,我们使用 sync_playwright
上下文管理器来启动 Playwright 并调用 run
函数执行测试。
视口(Viewport)
视口是设备参数的一部分,但您可以在某些测试中通过 page.set_viewport_size()方法来覆盖它。
测试文件中的使用:
在测试文件中,您也可以进行相同的操作。
# 使用给定的视口大小创建上下文
context = browser.new_context( viewport={ 'width': 1280, 'height': 1024 }
) # 为单个页面调整视口大小
page = context.new_page() # 假设您已经创建了一个页面实例
page.set_viewport_size({"width": 1600, "height": 1200}) # 模拟高分辨率DPI
context_high_dpi = browser.new_context( viewport={ 'width': 2560, 'height': 1440 }, device_scale_factor=2, # 设备缩放因子用于模拟高分辨率屏幕
)
isMobile
是否考虑了meta viewport
标签并启用了触摸事件
context = browser.new_context(isMobile=false
)
地区设置(Locale)与时区(Timezone)
模拟用户的地区设置和时区,这些设置可以在配置中全局地为所有测试设置,然后针对特定测试进行覆盖。
context = browser.new_context( locale='de-DE', timezone_id='Europe/Berlin',
)
-
locale='de-DE'
:指定了地区设置为德语(德国)。地区设置影响日期、时间、货币、数字等的格式和显示方式,以确保它们符合特定地区的习惯和标准。 -
timezone_id='Europe/Berlin'
:指定了时区为欧洲/柏林。时区设置决定了时间的计算和显示方式,以匹配用户所在的地理位置。
权限(Permissions)
允许应用显示系统通知。
context = browser.new_context( permissions=['notifications'],
)
特定域名允许通知
context.grant_permissions(['notifications'], origin='https://skype.com')
撤销所有权限
context.clear_permissions()
地理位置(Geolocation)
授予“地理位置”权限并将地理位置设置为特定区域
context = browser.new_context( geolocation={"longitude": 41.890221, "latitude": 12.492348}, permissions=["geolocation"]
)
这行代码创建了一个新的浏览器上下文(context
),并同时设置了两个关键参数:
-
地理位置(Geolocation):通过
geolocation
参数,您指定了一个具体的地理位置,这里使用了经纬度坐标(经度:41.890221,纬度:12.492348)。这意味着在此上下文中加载的网页或应用将能够访问这个预设的地理位置信息,而不是用户的实际位置。这对于测试那些依赖于地理位置信息的功能非常有用。 -
权限(Permissions):通过
permissions
参数,您指定了一个权限列表,其中包含了"geolocation"
。这表示您请求为当前上下文中的网页或应用授予地理位置权限。这样,即使网页或应用请求访问用户的地理位置信息,它也会接收到预设的位置信息,而不是触发浏览器的权限请求对话框。
稍后更改位置:
context.set_geolocation({"longitude": 48.858455, "latitude": 2.294474})
注意: 您只能为上下文中的所有页面更改地理位置。
这行代码表示在已经创建的浏览器上下文(context
)中,您可以通过调用 set_geolocation()
方法来更改当前设置的地理位置。
颜色方案和媒体类型
模拟用户的“颜色方案”。支持的值有 'light'(浅色模式)、'dark'(深色模式)和 'no-preference'(无偏好)。您还可以使用 page.emulate_media()方法来模拟媒体类型。
#创建深色模式的上下文
context = browser.new_context( color_scheme='dark' # 或者 'light'
)# 创建深色模式的页面
page = browser.new_page( color_scheme='dark' # 或者 'light'
)#更改页面的颜色方案
page.emulate_media(color_scheme='dark')#更改页面的媒体类型
page.emulate_media(media='print')
用户代理(User Agent)
用户代理是设备的一部分,因此您很少需要更改它。但是,如果您确实需要测试不同的用户代理,您可以使用 userAgent
属性来覆盖它。
context = browser.new_context( user_agent='My user agent'
)
代码创建了一个新的浏览器上下文,并通过 user_agent
参数设置了一个自定义的用户代理字符串 'My user agent'
。这样,在该上下文中加载的所有页面都将使用这个自定义的用户代理字符串来向服务器标识它们自己。
离线模式
模拟网络连接处于离线状态。
context = browser.new_context( offline=True
)
代码创建了一个新的浏览器上下文,并通过设置 offline=True
参数来模拟网络连接处于离线状态。在这个上下文中加载的任何页面或应用都将无法访问网络资源,因为它们会被视为处于离线状态。这对于测试网站或应用在离线时的行为非常有用,比如检查缓存策略、本地存储的使用情况或离线页面的展示效果。
禁用JavaScript
模拟用户场景中禁用JavaScript的情况。
context = browser.new_context( java_script_enabled=False
)
代码创建了一个新的浏览器上下文,并通过设置 javascript_enabled=False
参数来禁用JavaScript。在这个上下文中加载的任何页面或应用都将无法执行JavaScript代码,这模拟了用户禁用JavaScript的场景。这对于测试网站或应用在JavaScript被禁用时的行为非常有用,比如检查网站是否仍然提供基本功能或是否优雅地降级。