概述

Appium 是一个开源工具,用于在 iOS 移动设备、Android 移动设备和 Windows 桌面平台上自动化原生、移动网页和混合应用程序。本指南主要侧重于在移动设备上运行 Nightwatch 测试。

工作原理

Appium 是一个基于 Node JS 的服务器,它公开符合 Web 驱动程序协议的 REST API,并包装了来自供应商(UIAutomator2/Espresso、Apple XCUITest/UIAutomation)的自动化库。

在端到端场景中,Nightwatch 向 Appium 服务器发出请求,服务器使用不同的平台驱动程序与原生框架进行通信以执行命令,最后将 HTTP 响应返回给 Nightwatch。

appium-nightwatch

安装 Appium

第一步是 下载并设置 Appium

配置

我们可以在 Nightwatch 中添加配置,以在本地运行针对 Appium 服务器的移动设备上运行测试

nightwatch.conf.js
appium_ios: {
  selenium: {
    host: 'localhost',
    port: 4723
  },
  disable_error_log: true,
  webdriver: {
    timeout_options: {
      timeout: 150000,
      retry_attempts: 3
    },
    keep_alive: false,
    start_process: false
  },
  desiredCapabilities: {
    browserName: 'Safari', //not required incase using app
    javascriptEnabled: true,
    platformName: 'iOS', //android or iOS
    platformVersion: '15.0',
    deviceName: 'iPhone 13'
    // "app": APP_PATH + "ios/PieDrive.app", // path for the ios app you want to test
  }
}

您可以在 Appium 文档 中找到有关功能和更多详细信息

编写基本测试

这是一个演示测试,它在 Rijks Museum 网站上搜索“Night Watch”一词。

tests/sampleTest.js
describe('Nightwatch Website tests', function() {
    
it('Searching the Rijksmuseum ', async function(){ browser.navigateTo('https://www.rijksmuseum.nl/en'); const cookieDialogVisible = await browser.isVisible({ selector: '.cookie-consent-bar-wrap', suppressNotFoundErrors: true });
if (cookieDialogVisible) { browser.click('.cookie-consent-bar-wrap button.link'); } browser.pause(1000).click('a[aria-label="Search"]');
return browser.setValue('input.search-bar-input[type=text]', ['night watch']) .click('button.button.search-bar-button') .pause(1000) .assert.containsText('.search-results', 'The Night Watch, Rembrandt van Rijn, 1642'); }); });

要执行测试,请使用命令appium在本地运行 Appium 服务器,并针对appium_ios环境运行您的测试。

使用手势

手势在与移动设备交互时被广泛使用。在移动设备上生成手势有两种方法。

1) 使用 Appium 的非标准 API

这些 API 是平台特定的。您可以在 Appium 文档 中找到有关这方面的更多信息。要在 iOS 设备上生成滑动手势,命令将如下所示

browser.execute('mobile: swipe', args);
2) 使用 Actions API

Actions API 非常通用且与平台无关。它依赖于输入源(键、指针、滚轮)的概念。以下代码使用 Actions API 生成滑动和捏合缩放手势

tests/sampleTest.js
describe('W3C Actions API', function() {
  it('swipe down and zoom in the page - w3c actions api ', async function(){
    //Scroll down the page
    await  browser.perform(function(){
      const actions = this.actions();
      
return actions.move({x: 100, y: 100}).press().move({origin: 'pointer', y: -300, duration: 50}).release(); });
await browser.pause(2000);
//Pinch zoom await browser.perform(function(){ const actions= this.actions(); const pointer1 = new Device('finger-1', 'touch'); const pointer2 = new Device('finger-2', 'touch'); actions.insert(pointer1, pointer1.move({duration: 0, x: 100, y: 70}), pointer1.press(), {type: 'pause', duration: 500}, pointer1.move({duration: 1000, origin: 'pointer', x: 0, y: -20}), pointer1.release()); actions.insert(pointer2, pointer2.move({duration: 0, x: 100, y: 100}), pointer2.press(), {type: 'pause', duration: 500}, pointer2.move({duration: 1000, origin: 'pointer', x: 0, y: 20}), pointer2.release());
return actions; }); }); });