概述

到目前为止,如果您一直按照文档进行操作,那么您已经设置了移动测试要求,并且还使用维基百科应用程序运行了第一个示例测试。如果还没有,请参阅 安装指南

现在,是时候编写您自己的测试了。

Nightwatch 具有原生命令来自动执行对原生移动应用的测试。在幕后,Nightwatch 包装了 Appium 方法,以便用户可以享受使用 Nightwatch 的熟悉性和便捷性。所有命令和断言都可以在 app 全局变量上使用。要检查元素并找出选择器,您可以使用 Appium 检查器。

Appium 检查器

在为 Web 浏览器编写测试时,您可以打开浏览器,打开开发者工具,检查元素并推导出选择器。对于原生移动应用,您可以使用 Appium 检查器来完成相同的工作。如果您尚未安装 Appium 检查器,请参阅以下 指南

如何启动 Appium 检查器?

步骤 1

要启动 Appium 检查器,首先在您要检查的代码行添加 .debug() 命令。

nightwatch/examples/mobile-app-tests/wikipedia-android.js
describe('Wikipedia Android app test', function() {
    before(function(app) {
        app.click('id', 'org.wikipedia:id/fragment_onboarding_skip_button');
    });
    
it('Search for BrowserStack', async function(app) { app .click('id', 'org.wikipedia:id/search_container') .sendKeys('id', 'org.wikipedia:id/search_src_text', 'browserstack') .debug() //Added debug command. The inspector will be at a state where previous step is executed .click({selector: 'org.wikipedia:id/page_list_item_title', locateStrategy: 'id', index: 0}) .waitUntil(async function() { // wait for webview context to be available const contexts = await this.appium.getContexts();
return contexts.includes('WEBVIEW_org.wikipedia'); }) .appium.setContext('WEBVIEW_org.wikipedia') .assert.textEquals('.pcs-edit-section-title', 'BrowserStack'); // command run in webview context }); });

步骤 2
使用调试命令运行测试。Nightwatch 将启动一个新的测试会话,执行该步骤,并在遇到 .debug() 命令时暂停执行。现在,启动 Appium 检查器应用程序,以便它可以连接到测试会话。

步骤 3
在 Appium 检查器中,您可以通过单击“连接会话”并从下拉列表中选择会话来连接到上一步中启动的会话。

步骤 4
连接会话后,您可以单击左侧的元素,以在右侧面板中获取选择器选项,如下所示

Selectors using Appium Inspector

您甚至可以使用选择器测试您的命令/断言,方法是先在 .debug() 终端控制台中运行它,然后将其添加到您的测试中。

选择器

与 Web 自动化的选择器类似,查找应用程序相关元素也需要选择器。Appium 支持以下选择器策略,因此默认情况下,Nightwatch 也将支持所有这些选择器

  • id
  • xpath

详细示例可以在 此处 找到

命令

用于测试原生移动应用的命令可以分为两类

  1. 应用程序相关命令可用于与应用程序交互
  2. 设备相关命令可用于与设备交互
  • app.click('选择器策略','选择器值')
  • app.sendKeys('选择器策略','选择器值','要输入的值')
  • app.clearValue('选择器策略','选择器值')
  • app.setValue('选择器策略','选择器值')
  • app.appium.getContexts()
  • app.appium.getContext()
  • app.appium.setContext()
  • app.appium.startActivity([opts][4], callback)
  • app.appium.getCurrentActivity(callback) [回调返回活动名称]
  • app.appium.getCurrentPackage(callback) [回调返回包名称]
  • app.appium.getOrientation(callback) [回调返回 LANDSCAPE | POTRAIT]
  • app.appium.setOrientation(orientation, callback) [回调返回 LANDSCAPE | POTRAIT]
  • app.appium.getGeolocation(callback) [回调返回地理位置]
  • app.appium.setGeolocation({latitude, longitude, altitude}, callback)
  • app.appium.pressKeyCode([keycode][5], callback)
  • app.appium.longPressKeyCode([keycode][5], callback)
  • app.appium.hideKeyboard([callback])
  • app.appium.isKeyboardShown(callback) [回调返回布尔值]

详细示例可以在 此处 找到

断言

最后,编写测试的目标是添加断言,以便可以验证端到端功能流程。原生移动应用的断言与 Web 的断言非常相似。

断言库

  • app.assert.textContains(selector,'text')
  • app.assert.textEquals(selector,'text')
  • app.assert.textMatches(selector, 'text')
  • app.assert.attributeContains(selector,'attribute','value')
  • app.assert.attributeEquals(selector,'attribute','value')
  • app.assert.attributeMatches(selector, 'attribute','value')
  • app.assert.selected(selector)
  • app.assert.enabled(selector)
  • app.assert.visible(selector)
  • app.assert.elementsCount(selector)
  • app.assert.elementPresent(selector)

Chai expect

此外,您还可以使用 Chai 样式的断言

例如

Chai 异常示例
app.appium.getCurrentActivity(function(activity) {
    expect(activity.value).to.equal('.page.PageActivity')
})

详细示例可以在 此处 找到

现在您已经了解了为移动应用编写测试的基础知识,是时候更详细地了解选择器、命令和断言了

选择器
命令
断言