为原生移动应用编写测试
概述
到目前为止,如果您一直按照文档进行操作,那么您已经设置了移动测试要求,并且还使用维基百科应用程序运行了第一个示例测试。如果还没有,请参阅 安装指南
现在,是时候编写您自己的测试了。
Nightwatch 具有原生命令来自动执行对原生移动应用的测试。在幕后,Nightwatch 包装了 Appium 方法,以便用户可以享受使用 Nightwatch 的熟悉性和便捷性。所有命令和断言都可以在 app
全局变量上使用。要检查元素并找出选择器,您可以使用 Appium 检查器。
Appium 检查器
在为 Web 浏览器编写测试时,您可以打开浏览器,打开开发者工具,检查元素并推导出选择器。对于原生移动应用,您可以使用 Appium 检查器来完成相同的工作。如果您尚未安装 Appium 检查器,请参阅以下 指南。
如何启动 Appium 检查器?
步骤 1
要启动 Appium 检查器,首先在您要检查的代码行添加 .debug()
命令。
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
连接会话后,您可以单击左侧的元素,以在右侧面板中获取选择器选项,如下所示
您甚至可以使用选择器测试您的命令/断言,方法是先在 .debug()
终端控制台中运行它,然后将其添加到您的测试中。
选择器
与 Web 自动化的选择器类似,查找应用程序相关元素也需要选择器。Appium 支持以下选择器策略,因此默认情况下,Nightwatch 也将支持所有这些选择器
- id
- xpath
详细示例可以在 此处 找到
命令
用于测试原生移动应用的命令可以分为两类
- 应用程序相关命令可用于与应用程序交互
- 设备相关命令可用于与设备交互
应用程序相关命令
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
样式的断言
例如
app.appium.getCurrentActivity(function(activity) {
expect(activity.value).to.equal('.page.PageActivity')
})
详细示例可以在 此处 找到
建议的下一步
现在您已经了解了为移动应用编写测试的基础知识,是时候更详细地了解选择器、命令和断言了