草庐IT

Appium 安卓自动化(Appium Inspector)

狄仁杰666 2023-03-28 原文

前言

来啦老铁!

如我在上期文章 Appium 安卓自动化(环境搭建) 中所讲的那样,我打算用几篇文章记录一下手机端自动化测试的探索过程,感兴趣的读者也可以翻翻上期介绍环境搭建的文章。

而今天我们要学习记录的是:

  • Appium Inspector 的使用;

Appium Inspector 早期是是 Appium GUI自带的一个元素定位工具,具体入口在 GUI 启动 server 后的下图入口:

Appium Inspector

早期点击入口后可以直接打开 Appium Inspector 进行元素定位等后续操作;

而后来,Appium 将 Appium Inspector 从 Appium GUI 上剥离出去,作为另一个独立的应用。

接下来我们一起来看看如何使用 Appium Inspector 吧~

学习路径

  1. 下载安装 Appium Inspector 应用;
  2. 认识 Appium Inspector 应用界面;
  3. 配置 Appium Inspector 基础配置项;
  4. 配置 Appium Inspector Desired Capabilities 配置项;
  5. 系统环境变量处理;
  6. 启动 Session;
  7. 使用 Appium Inspector 进行元素定位;

1. 下载安装 Appium Inspector 应用;

点击上述 Appium GUI 上的 Appium Inspector 入口会把我们带往 Appium Inspector 的 git 仓库,Appium Inspector 提供两种使用方式,一种为桌面应用,一种为网页应用,如下图:

Appium Inspector 的两种使用方式
  • 先来看看桌面版;

a. 点击 Releases 入口,前往下载站点下载桌面应用包,例如我选择 mac 版:

下载 Appium Inspector

b. 下载完成后,打开安装包进行安装;
c. 安装完成后就能在电脑上看到安装好的 Appium Inspector 应用;

安装 Appium Inspector 应用
  • 再来看看网页版;

点击 web application 入口,便可打开网页版,网页版的网址:https://inspector.appiumpro.com/

Appium Inspector 网页版

与桌面版一模一样,事实上,通过简单阅读 Appium Inspector 的源代码,我们会发现,Appium Inspector 的桌面版是使用 Electron 技术的,从原理上来说,实际上与网页版基本没有差异,因此,我们不用过多研究二者的差异,可以认为是相同的;

2. 认识 Appium Inspector 应用界面;

  • Appium Inspector 应用界面 如下:
Appium Inspector 应用界面
  • 其中:

a. 编码 1 为 Appium server 配置项区域,其中 Remote Host 默认为 0.0.0.0,Remote Port 默认为 4723,Remote Path 默认为 /。

b. 编码 2、3 区域为 Capabilities 相关区域,也即 Appium session 相关区域,其中编号 2 区域的 Desire Capabilities 为 Capabilities 的手动逐个添加区域,编号 3 区域为 JSON 形式的 Capabilities 的批量添加区;

3. 配置 Appium Inspector 基础配置项;

  • 我们需要将区域 1 中的 Remote Path 作一下修改,将其值改为 /wd/hub;

没错,跟 selenium server 一样,懂 UI 自动化的都懂;

修改 Remote Path 值

4. 配置 Appium Inspector Desired Capabilities 配置项;

接下来便是十分重要的 Desired Capabilities 配置项,这关系到我们能否接管我们的设备,进而从事元素定位等相关工作;

  • 根据上一篇文章中的 Capabilities 以及 Appium Inspector Desired Capabilities 配置项的配置规则,基本配置如下:
{
  "platformName": "Android",
  "appium:automationName": "UiAutomator2",
  "appium:browserName": "Chrome",
  "appium:platformVersion": "7.0",
  "appium:deviceName": "pixel2",
  "appium:udid": "emulator-5554"
}
Appium Inspector Desired Capabilities 配置项

(由于笔者要探索的是使用 Appium Inspector 对手机端浏览器进行元素定位,因此此处并未设计 app 包名即 appium:appPackage、app activity 即 appium:appActivity 等相关的配置,取而代之的是 appium:browserName)。

如此,便可以开始连接我们的设备了,如安卓虚拟机、安卓机器;

5. 系统环境变量处理;

  • 配置完成后,我们点击应用的右下角的 “Start Session” 按钮,连接我们的设备;
  • 然而,刚开始可能会遇到一些问题,比如下面的报错:

Failed to create session.
An unknown server-side error occurred while processing the command. Original error: Cannot verify the signature of '/Applications/Appium Server GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-uiautomator2-server/apks/appium-uiautomator2-server-v4.24.0.apk'. Original error: The JAVA_HOME environment variable must be set for Android Tools to work properly

报错
  • 根据报错提示,需要设置 JAVA_HOME 环境变量,具体步骤为:

a. 命令行打开 ~/.bash_profile 文件:

vi ~/.bash_profile

b. ~/.bash_profile 文件内按 i 进入编辑模式

c. 在 ~/.bash_profile 文件内增加内容:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-18.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib

其中 JAVA_HOME 的值需要读者自行在电脑上找到对应的文件夹;

d. 按键盘的 esc 按钮;

e. ~/.bash_profile 文件中输入如下文本并回车,完成保存;

:wq!
  • 完成后再次点击 “Start Session” 按钮,如果还存在问题,则需要重启 Appium Inspector(忘记我探索过程中是否有因为重启解决了这个问题,总之重启过)。

6. 启动 Session;

  • 前提是我们已经启动了 Appium Server,这个参考上期文章中 Appium 安卓自动化(环境搭建) 中的步骤7,启动 appium server;
  • 当然还有启动好了安卓虚拟机或已连接安卓机器;
  • 点击 Appium Inspector 上右下角的 “Start Session” 按钮启动 Session;
启动 Session
  • 稍等片刻后,我们的安卓虚拟机或安卓设备打开 Chrome 浏览器空白页面:
image.png
  • 同时,Appium Inspector 变为:

如此,便表示 Session 已经创建成功;

7. 使用 Appium Inspector 进行元素定位;

作为演示用途,我将演示菜鸟教程网站后,获取菜鸟教程网站页面上的元素定位。

  • 手机端输入网址访问菜鸟教程网站:
访问菜鸟教程网站
  • Appium Inspector 点击刷新按钮;
刷新
  • 选择被测对象的类型;

这个有 2 个选项,一个是 Native App Mode(原生 App 模型),一个是 Web/Hybrid App Mode(网页或混合应用模型),默认是 Native App Mode,在本例我需要切换为 Web/Hybrid App Mode,否则无法进行元素定位;

Web/Hybrid App Mode
  • 使用选择元素入口进行元素定位;
元素定位

(双击 xpath 值即可进行复制 xpath 值)

至此,我们已经能通过 Appium Inspector 定位手机网页上页面元素。

特别注意:

  • 实际操作过程中,我发现,利用 Appium Inspector 定位手机网页页面元素经常难以精准定位,效果极差,因此,手机网页上页面元素还是更推荐使用桌面浏览器的 emulator 对元素进行定位,效果如下:
使用桌面浏览器的 emulator
  • 反观利用 Appium Inspector 定位原生 app 的页面元素,则效果比较好,如对系统闹钟这个应用内的元素进行定位:
定位原生 app 的页面元素

虽然本次探索学习并未能很好地达到定位手机网页页面元素的目的,但也并非一无是处,其价值体现在:

1. 了解了利用 Appium Inspector 定位手机网页页面元素这种方式并不靠谱;
2. 为将来原生应用页面元素定位奠定知识基础;

至此,我们已通过探索、学习,基本掌握了 Appium Inspector 定位元素的知识,今天先到这里,再接再厉~

能力有限,欢迎指正、互相交流,感谢~

如果本文对您有帮助,麻烦点赞、关注!

感谢~

有关Appium 安卓自动化(Appium Inspector)的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  3. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  4. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  5. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  6. ruby - 在 ruby​​ 中使用自动创建插入数组 - 2

    我想知道是否可以通过自动创建数组来插入数组,如果数组不存在的话,就像在PHP中一样:$toto[]='titi';如果尚未定义$toto,它将创建数组并将“titi”压入。如果已经存在,它只会推送。在Ruby中我必须这样做:toto||=[]toto.push('titi')可以一行完成吗?因为如果我有一个循环,它会测试“||=”,除了第一次:Person.all.eachdo|person|toto||=[]#with1billionofperson,thislineisuseless999999999times...toto.push(person.name)你有更好的解决方案吗?

  7. 【自动驾驶环境感知项目】——基于Paddle3D的点云障碍物检测 - 2

    文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3

  8. ruby-on-rails - 自动完成搜索的 Rails 实现 - 2

    我不确定如何为我的搜索功能添加自动完成表单。"get"do%>nil%>我有一个具有自定义操作的Controllerdefquery@users=Search.user(params[:query])@article=Search.article(params[:query])end模型如下:defself.user(search)ifsearchUser.find(:all,:conditions=>['first_nameLIKE?',"%#{search}%"])elseUser.find(:all)endenddefself.article(search)ifsearchArt

  9. ruby - 如何设置自动测试以仅重新运行失败的 rspec 示例 - 2

    我对自动测试的工作方式的印象(基于cucumbergithubwiki和其他在线内容)是它应该重新运行红色示例,直到它们通过。我的问题是它会重新运行规范文件中找到失败示例的所有示例,包括通过的示例。我不想浪费时间在修复失败示例的同时重新运行通过的示例。是否可以配置自动测试以便仅运行失败的示例? 最佳答案 您需要rspec-retrygem。以下是文档中有关如何实现它的一些示例:将它应用到覆盖整个测试套件的configureblock中...RSpec.configuredo|config|config.verbose_retry=t

  10. ruby - 在多个线程中引用类方法会导致自动加载循环依赖崩溃 - 2

    代码:threads=[]Thread.abort_on_exception=truebegin#throwexceptionsinthreadssowecanseethemthreadseputs"EXCEPTION:#{e.inspect}"puts"MESSAGE:#{e.message}"end崩溃:.rvm/gems/ruby-2.1.3@req/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:478:inload_missing_constant':自动加载常量MyClass时检测到循环依赖稍加研究后,

随机推荐