本文档将让您启动并运行一个简单的Appium测试,并向您介绍一些基本的Appium想法。有关Appium概念的更全面的介绍,请查看概念介绍
Appium可以通过两种方式之一安装:通过NPM或下载Appium Desktop,这是一种基于图形化、基于桌面的方式来启动Appium服务器。
如果您想通过npm install
运行Appium,使用Appium进行黑客攻击,或者贡献给Appium,您将需要node.js and NPM(使用nvm、n或brew install node
安装节点.js. 确保没有用sudo
安装Node或Appium,否则会遇到问题)。我们推荐最新的稳定版本,不过Appium支持Node10+。
实际安装非常简单:
npm install -g appium
只需从releases page下载Appium桌面的最新版本.
您可能想使用Appium来自动化一些特定的东西,比如iOS或Android应用程序。对特定平台自动化的支持由Appium“驱动程序”提供。有许多这样的驱动程序可以让您访问不同类型的自动化技术,并且每个驱动程序都有自己特定的设置要求。这些要求中的大多数与在特定平台上开发应用程序的要求相同。例如,要使用我们的一个Android驱动程序自动化Android应用程序,您需要在系统上配置Android SDK。
在某个时候,请确保查看要自动化的平台的驱动程序文档,以便正确设置系统:
要验证是否满足Appium的所有依赖项,可以使用appium-doctor
。使用npm Install-g appium doctor
安装它,然后运行appium doctor
命令,提供--ios
或--android
标志来验证是否正确设置了所有依赖项。
说到底,Appium只是一个HTTP服务器。它坐在那里等待来自客户机的连接,然后客户机指示Appium启动什么类型的会话,以及在会话启动后执行什么类型的自动化行为。这意味着你永远不会只使用Appium本身。您总是需要将它与某种类型的客户机库一起使用(或者,如果您喜欢冒险,可以使用cURL!)。
幸运的是,Appium使用与Selenium相同的协议,称为WebDriver协议。只需使用一个标准的Selenium客户机,就可以用Appium做很多事情。你甚至可能已经在你的系统上安装了其中一个。这就足够开始了,尤其是当您使用Appium在移动平台上测试web浏览器时。
Appium可以做Selenium做不到的事情,就像移动设备可以做web浏览器做不到的事情一样。因此,我们有一组采用多种编程语言的Appium客户端,这些客户端扩展了常规的Selenium旧客户端的附加功能。您可以在Appium clients list看到客户机列表和下载说明的链接。
在继续之前,请确保您已经下载了一个用您最喜欢的语言编写的客户端,并准备就绪。
现在我们可以启动一个Appium服务器,或者像这样从命令行运行它(假设NPM安装成功):
appium
或者单击Appium桌面中巨大的Start Server按钮。
Appium现在将向您显示一条小的欢迎消息,显示您正在运行的Appium版本以及它监听的端口(默认值是4723
)。这个端口信息是非常重要的,因为您必须指导您的测试客户机确保连接到这个端口上的Appium。如果要更改端口,可以在启动Appium时使用-p
标志(请确保查看 server parameters的完整列表)。
在本节中,我们将运行一个基本的“HelloWorld”Android测试。我们选择Android是因为它在所有平台上都可用。我们将使用UiAutomator2驱动程序,确保您已经阅读了该文档,并适当地设置了系统。我们还将使用JavaScript作为语言,这样我们就不必处理其他依赖项。
(很可能,您最终希望使用JavaScript以外的其他东西来自动化Android以外的其他东西。在这种情况下,请查看我们的sample code,它具有多种语言和平台的代码示例。)
对于这个例子,我们将使用Webdriver.io文件作为我们的Appium客户。为此示例创建一个目录,然后运行:
npm init -y
项目初始化后,安装webdriverio
:
npm install webdriverio
现在我们可以创建名为index.js
,并初始化客户端对象:
// javascript
const wdio = require("webdriverio");
接下来我们需要做的是启动一个Appium会话。我们通过定义一组服务器选项和所需的功能,并调用wdio.remote()
和他们在一起。所需的功能只是在会话初始化期间发送到Appium服务器的一组键和值,它们告诉Appium我们想要自动化什么样的事情。任何Appium驱动程序所需的最小功能集应包括:(这里不做详细介绍,请参阅Desired Capabilities参数详解)
platformName
: the name of the platform to automateplatformVersion
: the version of the platform to automatedeviceName
: the kind of device to automateapp
: the path to the app you want to automate (but use the browserName capability instead in the case of automating a web browser)automationName
: the name of the driver you wish to use// javascript
const opts = {
path: '/wd/hub',
port: 4723,
capabilities: {
platformName: "Android",
platformVersion: "8",
deviceName: "Android Emulator",
app: "/path/to/the/downloaded/ApiDemos-debug.apk",
appPackage: "io.appium.android.apis",
appActivity: ".view.TextFields",
automationName: "UiAutomator2"
}
};
async function main () {
const client = await wdio.remote(opts);
await client.deleteSession();
}
main();
您可以看到,我们已经指定了Appium端口,并构建了所需的功能以满足我们的需求(但不要忘记用系统的实际下载路径替换路径)。我们已经向webdriverio
注册了这个事实,现在有了一个client对象,它将表示到Appium服务器的连接。从这里开始,我们可以开始会话,执行一些测试命令,然后结束会话。在本例中,我们只需在文本字段中键入并检查输入的文本是否正确:
// javascript
const field = await client.$("android.widget.EditText");
await field.setValue("Hello World!");
const value = await field.getText();
assert.strictEqual(value, "Hello World!");
这里发生的事情是,在创建会话并启动我们的应用程序之后,我们指示Appium在应用程序层次结构中找到一个元素并将其键入。然后查询同一字段的文本,该文本被断言为我们期望的文本。
将所有这些放在一起,文件应该如下所示:
// javascript
const wdio = require("webdriverio");
const assert = require("assert");
const opts = {
path: '/wd/hub',
port: 4723,
capabilities: {
platformName: "Android",
platformVersion: "8",
deviceName: "Android Emulator",
app: "/path/to/the/downloaded/ApiDemos-debug.apk",
appPackage: "io.appium.android.apis",
appActivity: ".view.TextFields",
automationName: "UiAutomator2"
}
};
async function main () {
const client = await wdio.remote(opts);
const field = await client.$("android.widget.EditText");
await field.setValue("Hello World!");
const value = await field.getText();
assert.strictEqual(value,"Hello World!");
await client.deleteSession();
}
main();
你可以试着自己运行这个测试。只需保存并使用node
执行即可:
node index.js
如果一切都设置正确,你会看到Appium开始吐出大量日志,最终应用程序会弹出屏幕,并开始表现得好像一个隐形用户正在轻触它!