Appium是Android和iOS平台上自动化测试移动应用程序的热门开源工具之一。
要真正发挥Appium的强大功能,了解其内部工作原理至关重要。因此,理解Appium架构对于充分利用其在移动端自动化测试方面的潜力至关重要。
在这篇博文中,让我们一起深入了解Appium架构,并通过结合Appium不同组件的示例来有效地自动化测试移动应用程序。
什么是Appium?
Appium是一款开源的移动端自动化测试工具,支持对移动、Web、桌面以及智能电视应用等不同平台的用户界面(UI)进行自动化。
它允许使用单一的API为原生应用、混合应用以及移动Web应用编写测试,无论应用运行在哪个平台上。Appium支持多种编程语言,如Java、Python、JavaScript等,为开发人员和测试人员提供了极大的灵活性。
你无需修改你的移动应用或添加任何额外的内容,这意味着你可以在不改变移动应用工作方式的情况下进行自动化测试。
Appium是如何工作的?
Appium是Selenium WebDriver的一个扩展,因为它也遵循W3C标准,这些标准也被称为WebDriver规范。对于Web应用,几乎所有浏览器都通过遵循WebDriver规范在其浏览器中实现了自动化功能。
由于Appium也希望自动化测试移动用户界面,他们决定采用W3C WebDriver规范。由于Web和移动应用的用户界面在某种程度上是相似的,用户首先需要识别和找到界面上的元素以便对其执行操作。
W3C WebDriver规范API提供了一组一致的方法来查找元素并与它们进行交互。因此,它减少了测试人员学习Appium所需的时间,因为他们已经对Selenium WebDriver非常熟悉。
深入探索Appium架构
Appium由不同的组件组成,这些组件协同工作以实现移动应用的自动化测试目标。
以下是Appium v2.x的架构。你可以使用与你的编程语言偏好相对应的Appium客户端语言绑定来编写测试脚本。这个Appium客户端将通过传递目标平台的配置选项来与在你的机器或远程机器上运行的Appium服务器进行交互。
Appium服务器是一个Node.js API服务器,它将消耗这些配置选项,并根据配置选项将用户命令重定向到连接到Appium服务器实例的平台特定驱动程序实例。
Appium驱动程序将使用原生平台特定框架来将这些用户命令重定向到这些框架,这些框架实际上会在目标设备上执行这些用户命令。在上面的Appium架构图中,你还可以看到,如果你为Appium服务器配置了任何Appium插件,那么在执行与你的测试脚本相关的命令时,它也会执行这些Appium插件命令。
Appium不再像其初始版本v1.x那样是一个单一的组件。随着v2.x版本的发布,Appium已被拆分为独立的组件,这有助于我们编写可靠的测试脚本。Appium使用平台特定的驱动程序,这些驱动程序使用平台特定的原生框架,如iOS平台的XCUITest和Android平台的UiAutomator2,因为这些框架为与设备更高效地进行交互提供了极大的支持。
让我们通过示例详细了解Appium的每个组件,以及如何使用这些组件和它们各自的应用场景:
Appium服务器
Appium服务器是一个Node.js API服务器。该服务器需要在连接移动设备的目标机器上运行。它作为自动化脚本的接触点,Appium客户端绑定会通过配置选项传入目标设备和应用程序的详细信息。
然后,Appium服务器会解析Appium客户端提供的选项,以确定在哪个可用的移动设备上启动Appium会话。要安装Appium服务器,你必须确保已在你的机器上安装了Node.js v18.x或更高版本。推荐的安装Node.js的方法是使用Node版本管理器(NVM)。
要安装NVM,请在你的终端上运行以下命令:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
这将安装NVM。现在,你可以运行命令nvm list
来查看所有支持的Node.js版本。建议安装v18.x LTS版本,NVM将其列为lts/hydrogen
。因此,要安装v18.x版本的Node.js,请运行以下命令:
nvm install lts/hydrogen
此命令将安装v18.x LTS的最新版本。一旦Node.js安装完成,你现在可以通过在终端上运行以下命令来安装Appium服务器:
npm i -g appium
要确认Appium是否已成功安装,你可以运行命令appium -v
并检查Appium服务器的最新安装版本。在这篇关于Appium架构的博客中,我们使用的是Appium服务器版本v2.11.1。
要启动Appium服务器会话,请在你的终端上执行以下命令:
appium server --address 127.0.0.1 --port 4723
此命令将启动Appium服务器会话,你可以在此配置自动化脚本以连接并测试移动应用程序。默认情况下,此命令将使用所有已安装的Appium驱动程序。
Appium驱动程序
Appium驱动程序是Appium客户端与目标设备之间的桥梁。Appium服务器主要负责处理Appium客户端与Appium驱动程序之间的通信。Appium客户端执行的Appium命令会被重定向到相应的Appium驱动程序,该驱动程序会与Appium服务器启动会话。
Appium驱动程序实现了WebDriver规范API方法。每个驱动程序在实现时都会使用其各自平台的原生技术。例如,XCUITest驱动程序将使用WebDriverAgent,这是使用Swift编程语言和Xcode的原生命令开发的,而UiAutomator2将在其各自的驱动程序中使用Android的原生方法。
在Appium v2.x版本中,Appium已完全将驱动程序与我们先前安装的实际Appium服务器包解耦。现在,你只需安装实际所需的驱动程序。
让我们通过在终端上运行以下命令来查看Appium驱动程序的列表:
appium driver list
此命令将显示所有支持的驱动程序,如下面的截图所示:
现在,要安装任何特定的驱动程序,你可以运行以下命令:
appium driver install
在此命令中,你可以通过将上述命令中的替换为之前执行的列表命令中显示的驱动程序名称来安装特定的驱动程序。
要检查已安装的驱动程序是否有任何更新,你可以执行以下命令,它将列出所有驱动程序,并提及当前已安装的版本以及可用于更新的新版本:
appium driver list --updates
要更新特定的驱动程序,你需要在终端上执行以下命令:
appium driver update
在此命令中,只需将替换为你要更新的驱动程序的实际名称。
要在Appium服务器会话中使用特定的Appium驱动程序,你需要在上一节中看到的Appium服务器命令中添加一个额外的参数–use-drivers,并通过逗号分隔提供所有所需的驱动程序名称。
例如,以下命令仅用于启动Android的Appium服务器会话:
appium server --address 127.0.0.1 --port 4723 --use-drivers uiautomator2
一旦你执行了上面的命令,你将在终端上看到以下输出:
现在,你已经准备好使用你选择的Appium客户端连接到这个Appium服务器会话了。
Appium客户端库
由于Appium基于W3C WebDriver规范,因此它实现了客户端-服务器架构。服务器包括Appium服务器,该服务器使用安装的驱动程序以及任何Appium插件,并负责管理被测目标设备。
你用于编写Appium测试的客户端将通过HTTP网络向服务器发送命令。服务器将执行命令,并在响应中向客户端返回状态码,客户端将使用该状态码来确定命令是否由服务器成功执行,或者是否出现了任何错误。
Appium客户端发送给Appium服务器的命令实际上是每个命令的API端点。由于API与语言无关,因此你使用哪种编程语言并不重要。这就是为什么Appium支持多个客户端绑定的原因。
要使用Appium客户端连接到已经运行的Appium服务器会话,我们将以Appium Java客户端为例。让我们看看如何将我们的Appium测试脚本连接到Appium服务器。
首先,你需要在pom.xml文件中添加Appium Java客户端依赖项,如下所示:
<dependencies>
<dependency>
<groupId>io.appium</groupId>
<artifactId>java-client</artifactId>
<version>9.2.3</version>
</dependency>
</dependencies>
之后,你可以创建UiAutomator2Options,它描述了目标设备以及被测应用程序。然后,你可以使用此选项为已经运行的Appium服务器创建一个Appium会话。
var options = new UiAutomator2Options ()
.setDeviceName ("Pixel 8 Pro")
.setPlatformVersion ("13")
.setAvd ("Pixel_8_Pro")
.setApp (Path.of (System.getProperty ("user.dir"), "src/test/resources", "wdio-demo.apk").toString ());
var driver = new AndroidDriver (“http://127.0.0.1:4723”, options);
使用其他客户端绑定语言连接到Appium服务器可以采用类似的方法。
你无需通过终端启动Appium服务器;你还可以使用Appium客户端绑定以编程方式启动Appium服务器。
让我们看一个使用Appium Java客户端的示例,了解如何启动服务器并连接到该服务器:
var builder = new AppiumServiceBuilder ();
var service = builder.withIPAddress ("127.0.0.1")
.usingPort (4723)
.withArgument (GeneralServerFlag.LOG_LEVEL, "info")
.withArgument (GeneralServerFlag.USE_DRIVERS, "uiautomator2")
.withArgument (GeneralServerFlag.SESSION_OVERRIDE)
.build ();
service.start();
. . .
var driver = new AndroidDriver (service.getUrl (), options);
. . .
service.stop();
driver.quit();
在初始化驱动程序实例之前,你需要确保通过调用service.start()方法来启动服务器,因为我们在初始化驱动程序时使用了service.getUrl()方法,该方法将返回我们的测试脚本启动Appium服务器的实际URL。
Appium 插件
Appium 提供了一种新的可扩展且可选的方法,用于在实时会话期间扩展和修改 Appium 的行为,从而为测试人员添加新的和自定义的功能,而无需实际修改 Appium 服务器核心。Appium 的这一功能被称为 Appium 插件。该功能是在 Appium v2.x 版本发布时引入的。
随着 Appium 插件的引入,你可以创建自己的插件实现,帮助你解决特定问题或为 Appium 引入新功能。如果你不打算创建自己的 Appium 插件,可以使用其他贡献者或 Appium 核心开发人员已经创建的插件。
你可以使用的一些有用的 Appium 插件包括 appium-device-farm 和 appium-dashboard-plugin。
Appium 开发团队维护了一些官方插件,你可以通过在终端上执行以下命令来查看:
appium plugin list
它将显示如下输出:
要安装任何插件,即使是那些未在上述命令的输出中显示的插件,你必须执行以下命令:
appium plugin install --source=npm
你只需将 <plugin-name>
替换为插件的实际名称。每个插件都会更新其文档,其中会提到插件的名称。
与 Appium 驱动程序类似,你可以通过执行以下命令来检查是否有任何已安装的 Appium 插件的可用更新:
appium plugin list --updates
如果你要更新任何插件,只需在终端上执行以下命令:
appium plugin update
此命令将安装插件的最新可用版本。
为了使用任何插件,在启动 Appium 服务器会话时,你需要在 Appium 服务器命令中传递一个额外的参数 --use-plugins
。
例如,查看以下命令,该命令将启动 Android 设备的 Appium 服务器会话,并同时使用 appium-device-farm
插件:
appium server --address 127.0.0.1 --port 4723 --use-drivers uiautomator2 --use-plugins=device-farm --plugin-device-farm-platform=android
你是否注意到了额外的参数 --plugin-device-farm-platform
?这个参数是特定于插件的。
Appium Inspector
Appium Inspector 是移动端自动化测试中的一个有用功能,它允许你找到想要与之交互的元素。Appium 提供了一个用户界面应用程序,你可以使用它连接到目标设备、安装被测应用程序,并允许你找到元素定位器,之后你可以在使用 Appium 客户端进行自动化测试时与该元素进行交互。
你可以通过访问其 GitHub 存储库的发布页面来下载最新版本的 Appium Inspector。你可以根据自己的操作系统选择合适的安装程序。文件下载完成后,执行该文件并运行安装程序,以在你的计算机上安装 Appium Inspector。
安装完 Appium Inspector 后,首次启动时会显示以下屏幕:
在这个屏幕上,你可以为目标设备和被测应用程序设置 Appium 功能。设置完功能后,你可以将这些功能保存为预设,以便日后使用。这里有一点需要注意,你必须先在本机上启动 Appium 服务器,然后再点击“开始会话”按钮。
在目标设备上启动被测应用程序的 Appium Inspector 会话后,你应该会看到以下屏幕,你可以在其中检查元素并找到定位器:
使用 Appium Inspector,你不仅可以找到想要执行不同类型操作的目标元素,还可以在设备上执行不同类型的操作命令,并模拟设备屏幕或元素上的不同手指手势。
Appium Doctor
为你的机器配置 Appium 是一个复杂的过程,如果任何设置步骤遗漏或未正确完成,你将无法进行平台自动化。为了帮助用户正确设置机器,Appium 生态系统提供了 Appium Doctor 命令行工具,该工具可以检查各个平台的设置情况。
例如,如果你想检查特定平台的设置情况,可以在终端上运行以下命令:
appium driver doctor
如果你想检查 Android 设置,请将 替换为 Android 驱动程序,即 uiautomator2,对于 iOS,你可以使用 xcuitest。
执行完此命令后,你将看到以下输出:
如你所见,它会检查你的机器上是否安装了所有必需的和可选的软件包;如果没有,则会说明如何安装这些必需或可选的软件包。
虽然了解 Appium 架构至关重要,但考虑在哪里运行测试也同样重要。在本地设置设备可能会变得复杂且昂贵,尤其是当你需要在不同平台或同时测试多台设备时。
这就是 LambdaTest 的用武之地。凭借其 AI 驱动的云测试平台,你可以轻松地在在线设备农场中运行你的 Appium 测试,而无需担心维护硬件或处理复杂的设置。只需上传你的测试脚本,剩下的交给 LambdaTest 处理即可。你可以访问各种设备,获得更快的测试执行速度,以及并行测试功能,以加快你的发布周期。
结论
在过去的12年里,Appium的发展令人惊叹。随着Appium社区和贡献者的不断增长,Appium架构的这些功能也将得到增强。希望这篇博客能帮助你了解Appium架构以及如何使用不同的Appium组件来自动化移动应用程序。
常见问题解答(FAQs)
Appium的框架是什么?
Appium是一个跨平台、开源的移动自动化框架,它允许用户使用单一的代码库为Android和iOS应用程序编写测试,同时利用特定于平台的驱动程序。
Selenium和Appium架构之间的区别是什么?
Selenium主要用于网站和Web应用程序,它使用WebDriver与浏览器进行通信,而Appium则采用客户端-服务器模型,通过特定于平台的驱动程序(如Android的UIAutomator和iOS的XCUITest)来自动化移动应用程序。