最文档

使用Playwright进行移动端模拟测试

  Playwright 提供了强大的移动端模拟能力,支持模拟真实移动设备的屏幕尺寸、分辨率、用户代理(User Agent)、触摸事件、地理位置甚至网络条件,无需真实设备即可完成移动端网页/应用的功能与兼容性 测试。以下是具体实现步骤与核心场景示例(以 Python 为例):
   一、核心原理:通过“设备上下文”模拟移动环境
  Playwright 通过 browser.new_context() 或 chromium.launch_persistent_context() 创建“设备上下文(Context)”,在上下文配置中指定移动设备参数(如屏幕尺寸、UA 等),从而模拟移动浏览器行为。核心配置项包括:
   ·device_scale_factor:设备像素比(如视网膜屏为 2);
   · is_mobile:是否启用移动模式(开启后支持触摸事件);
   · viewport:屏幕可视区域大小(宽×高,单位像素);
   · user_agent:移动设备的 User Agent 字符串;
   · has_touch:是否支持触摸事件(移动端需开启)。
   二、基础操作:使用内置设备预设快速模拟
  Playwright 内置了 50+ 常见移动设备配置(如 iPhone 13、Pixel 7、iPad Pro 等),无需手动配置参数,直接调用即可。
   步骤 1:获取内置设备列表
  通过 playwright.devices 查看所有预设设备,例如:
  from playwright.sync import sync_playwright  
  with sync_playwright() as p:  
      # 打印所有内置设备名称(如 "iPhone 13", "Pixel 7")  
      print(list(p.devices.keys()))  
   步骤 2:模拟指定设备访问网页
  以“模拟 iPhone 13 访问 百度”为例:
  from playwright.sync import sync_playwright  
  with sync_playwright() as p:  
      # 1. 选择要模拟的设备(如 iPhone 13)  
      iphone_13 = p.devices["iPhone 13"]  
      # 2. 启动浏览器,创建移动设备上下文  
      browser = p.chromium.launch(headless=False)  # headless=False 可看到浏览器界面  
      context = browser.new_context(  
          **iphone_13,  # 解构设备参数(包含 viewport、ua、is_mobile 等)  
          locale="zh-CN",  # 可选:设置语言  
      )  
      # 3. 打开页面,模拟移动操作  
      page = context.new_page()  
      page.goto("https://www.baidu.com")  
      # 4. 示例:模拟移动端搜索(点击搜索框→输入文本→点击搜索按钮)  
      page.locator("input[type='search']").click()  # 触摸点击  
      page.keyboard.type("Playwright 移动端测试")  
      page.locator("input[type='submit']").nth(0).click()  
      # 5. 截图验证效果(保存为移动端尺寸的图片)  
      page.screenshot(path="iphone_13_baidu.png")  
      # 6. 关闭资源  
      context.close()  
      browser.close()  
  运行后,会看到浏览器以 iPhone 13 的屏幕尺寸(390×844)打开百度,且支持触摸交互。
   三、高级模拟:自定义设备参数与场景
   1. 自定义设备(非内置设备)
  若需模拟特定设备(如某款安卓机型),可手动配置参数:
  custom_device = {  
      "viewport": {"width": 412, "height": 915},  # 屏幕尺寸(如 三星 S21)  
      "user_agent": "Mozilla/5.0 ( Linux; Android 12; SM-G991B) AppleWebKit/537.36 ...",  # 安卓UA  
      "device_scale_factor": 2.625,  # 像素比  
      "is_mobile": True,  # 启用移动模式  
      "has_touch": True,  # 支持触摸  
      "default_browser_type": "chromium"  
  }  
  # 创建上下文时使用自定义设备  
  context = browser.new_context(** custom_device)  
   2. 模拟触摸事件(滑动、捏合缩放)
  移动端核心交互依赖触摸,Playwright 通过 page.touchscreen 提供触摸 API:
  滑动操作(如上下滑动页面):
  # 从 (x1, y1) 滑动到 (x2, y2)(坐标基于 viewport 尺寸)  
  page.touchscreen.tap(200, 300)  # 先点击起点  
  page.touchscreen.press(200, 300)  # 按下  
  page.touchscreen.move(200, 600)  # 移动(向下滑动)  
  page.touchscreen.release()  # 松开  
  捏合缩放(如放大图片):
  # 模拟双指捏合:两个触摸点从远到近(缩小)  
  page.touchscreen.tap(100, 200)  
  page.touchscreen.tap(300, 200)  
  with page.expect_event("touchstart"):  
      page.touchscreen.press(100, 200)  
      page.touchscreen.press(300, 200)  
  with page.expect_event("touchmove"):  
      page.touchscreen.move(150, 200)  # 两点靠近  
      page.touchscreen.move(250, 200)  
  page.touchscreen.release()  
   3. 模拟地理位置(GPS 定位)
  对依赖位置的应用(如地图、外卖),可模拟经纬度:
  # 设置初始地理位置(北京:北纬39.9,东经116.4)  
  context.set_geolocation(latitude=39.9, longitude=116.4)  
  # 访问需要定位的页面(如百度地图)  
  page = context.new_page()  
  page.goto("https://map.baidu.com")  
  page.screenshot(path="beijing_location.png")  
  # 动态修改位置(切换到上海)  
  context.set_geolocation(latitude=31.2, longitude=121.4)  
  page.reload()  
  page.screenshot(path="shanghai_location.png")  
   4. 模拟网络条件(2G/3G 环境)
  移动端常面临弱网问题,可通过 context.set_extra_http_headers 或 page.route 限制网络速度:
  # 模拟 3G 网络(下载 1MB/s,上传 512KB/s,延迟 300ms)  
  context = browser.new_context(**iphone_13)  
  context.set_network_conditions(  
      download_throughput=1024 * 1024,  # 下载吞吐量(字节/秒)  
      upload_throughput=512 * 1024,    # 上传吞吐量  
      latency=300                      # 延迟(毫秒)  
  )  
  # 测试弱网下页面加载时间  
  page = context.new_page()  
  page.goto("https://www.taobao.com")  
  print(f"页面加载时间:{page.evaluate('performance.timing.loadEventEnd - performance.timing.navigationStart')}ms")  
   四、响应式布局测试:快速切换设备尺寸
  通过动态修改 viewport 测试页面在不同尺寸下的响应式表现:
  # 定义多组设备尺寸( 手机、平板、小屏手机)  
  viewports = [  
      {"width": 375, "height": 667},  # iPhone SE  
      {"width": 768, "height": 1024}, # iPad  
      {"width": 320, "height": 568}   # 小屏手机  
  ]  
  for vp in viewports:  
      context = browser.new_context(  
          viewport=vp,  
          is_mobile=True,  
          has_touch=True  
      )  
      page = context.new_page()  
      page.goto("https://example.com")  
      page.screenshot(path=f"responsive_{vp['width']}x{vp['height']}.png")  
      context.close()  
   五、最佳实践与注意事项
  结合截图/录屏验证:通过 page.screenshot() 或 context.tracing 录制操作过程,直观确认布局和交互是否符合预期。
  # 开启追踪(记录所有操作、网络请求、DOM变化)  
  context.tracing.start(screenshots=True, snapshots=True)  
  # 执行操作...  
  context.tracing.stop(path="mobile_trace.zip")  # 生成追踪文件(可在 Playwright Trace Viewer 中查看)  
  处理移动端特有元素:如汉堡菜单(点击展开导航)、底部悬浮按钮,需通过 page.locator 精准定位(优先使用 data-testid 等稳定属性)。
  与测试框架集成:结合 pytest 等框架实现批量用例执行,例如:
  import pytest  
  from playwright.sync import sync_playwright  
  @pytest.mark.parametrize("device", ["iPhone 13", "Pixel 7", "iPad Pro 11"])  
  def test_mobile_compatibility(device):  
      with sync_playwright() as p:  
          browser = p.chromium.launch()  
          context = browser.new_context(** p.devices[device])  
          page = context.new_page()  
          page.goto("https://example.com")  
          assert page.title() == "Example Domain"  # 验证核心功能  
          context.close()  
          browser.close()  
  注意浏览器差异:移动端 Safari(WebKit)和 Chrome(Chromium)对 CSS/JS 的支持可能不同,建议用 p.webkit 和 p.chromium 分别测试。
   总结
  Playwright 移动端模拟通过“设备上下文”实现了对屏幕、触摸、网络、地理位置的全方位模拟,结合内置设备预设和自定义配置,可高效覆盖从 功能测试到兼容性验证的场景。其优势在于:无需真实设备、支持多浏览器、API 简洁且与桌面自动化统一,大幅降低移动端测试的门槛。
   本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理

本文链接:https://www.bdoc.cn/post/27.html

版权声明:本文内容不用于商业目的,如涉及知识产权问题,请权利人联系小编QQ或者微信:799549349,我们将立即处理

联系客服
返回顶部
使用Playwright进行移动端模拟测试_APP测试_最文档

最文档