将 Nightwatch 与 Appium 一起使用以进行移动网页测试
概述
Appium 是一个开源工具,用于在 iOS 移动设备、Android 移动设备和 Windows 桌面平台上自动化原生、移动网页和混合应用程序。本指南主要侧重于在移动设备上运行 Nightwatch 测试。
工作原理
Appium 是一个基于 Node JS 的服务器,它公开符合 Web 驱动程序协议的 REST API,并包装了来自供应商(UIAutomator2/Espresso、Apple XCUITest/UIAutomation)的自动化库。
在端到端场景中,Nightwatch 向 Appium 服务器发出请求,服务器使用不同的平台驱动程序与原生框架进行通信以执行命令,最后将 HTTP 响应返回给 Nightwatch。
安装 Appium
第一步是 下载并设置 Appium。
配置
我们可以在 Nightwatch 中添加配置,以在本地运行针对 Appium 服务器的移动设备上运行测试
nightwatch.conf.js
您可以在 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;
});
});
});