草庐IT

Appium详解(超详细)

小浩丶 2023-04-10 原文

一、Appium 环境搭建:

    1、安装Appium Python Client包:

            pip install Appium-Python-Client -i https://pypi.douban.com/simple

            pip install selenium -U # 确保selenium和appium版本匹配

    2、安装Appium服务端:

            下载地址1:https://github.com/appium/appium-desktop/releases/latest

            下载地址2:https://bitbucket.org/appium/appium.app/downloads/

    3、安装并配置JDK:

            下载 jdk 地址:https://www.oracle.com/technetwork/java/javase/downloads/index.html

            检查电脑是否有安装过jdk或是否安装成功:cmd窗口----输入 java -version

            检查是否已配置环境变量:cmd窗口----输入 javac

            配置环境变量:

            1、变量名:JAVA_HOME 变量值:C:/Program Files/Java/jdk1.8.0_151(注意这里是安装jdk的路径,最好是英文路径)

            2、变量名:PATH 变量值:C:/Program Files/Java/jdk1.8.0_151/bin;C:/Program Files/Java/jdk1.8.0_151/bin;(注意这里是两个路径,用分号隔开)

            3、变量名:CLASSPATH 变量值:C:/Program Files/Java/jdk1.8.0_151/lib/dt.jar;C:/Program Files/Java/jdk1.8.0_151/lib/Tools.jar;(可不配置)
    配置完后重启cmd窗口,输入javac验证是否配置成功

    4、下载安装并配置SDK:

            下载sdk地址1: http://developer.android.com/studio/installing/index.html(划到下面“Command line Tools only”下载即可)

            下载sdk地址2: https://developer.android.google.cn/studio/(官网)

    配置环境变量:
            1、变量名:ANDROID_HOME
                 变量值:D:/Android-SDK-Windows(注意这里是安装sdk的路径,最好是英文路径)
            2、变量名:PATH
                 变量值:D:/Android-SDK-Windows/Tools;D:/Android-SDK-Windows/platform-Tools(注意这里是安装sdk的路径,最好是英文路径)

            配置完后启动cmd窗口,输入adb --version,验证是否配置成功(出现版本号则为成功)

    5、安装并配置nodejs(此步可以不做 ):

            下载nodejs地址:http://nodejs.cn/download/

            验证是否安装成功,打开cmd窗口,输入node -v (如果出现了版本号则为成功)

    6、连接真机:

            1、用数据线连接,注意有的数据线只能用来充电

            2、手机必须开启开发者模式

            3、有的手机必须安装驱动才能连接

            4、以上步骤确认无误后,在电脑cmd窗口输入:adb devices 连接手机
 

------------------------------------------------------------------------------------------

二、ADB 相关命令:

    1、 adb基础命令:

            1 adb devices 查看已连接的设备与模拟器 devices/offline/no devices/unauthorized

            2. adb connect ip port—连接设备

            3. adb disconnect ip port----取消连接

            4. adb version----查看adb的版本

            5. adb start-server----启动adb服务

            6. adb kill-server----杀掉adb服务

            7. adb install 绝对路径 (必须是英文)----安装程序

            8. adb uninstall 包名-----卸载程序

            9. adb shell pm list packages -3 -----输出系统用户安装的第三方app包名

            10. adb shell pm list packages -s ------输出系统自带的包名

            11. adb pull /data/anr/traces.txt D:/log -----把手机端的文件拷贝到电脑端

            12. adb push D:/log/traces.txt /data/anr ------把电脑端的文件拷贝到手机端

    2、获取app包名和启动名命令:

            1、windows命令:adb shell dumpsys window windows | findstr mFocusedApp #获取当前打开应用的包名和当前页面启动名
            windows命令:adb shell dumpsys activity recents | findstr "intent={" #该命令获取最近的活动程序,通常是第一行的;

            windows命令:aapt.exe dump badging 存放apk的目录(针对没有安装app的情况)

            2、Linux命令:adb shell dumpsys window windows | grep mFocusApp

    3、过滤指定app的日志:adb logcat -v time | findstr 包名

            获取系统版本号:adb shell getprop ro.build.version.release

            获取手机webview版本:adb shell am start -a android.intent.action.VIEW -d https://liulanmi.com/labs/core.html

            获取App的启动时间:adb shell am start -W 包名/启动名

            1、TotalTime:app自身启动时间

            2、WaitTime:系统启动app时间
 

------------------------------------------------------------------------------------------

三、Appium 启动配置:

from appium import webdriver  # 后续操作依赖于这个库

desired_caps = {
    'platformName': 'Android',  # 设备类型;
    'platformVersion': '6',  # 设备的类型的版本号,如果是安卓,填写大的版本号即可,小数不用填;
    'deviceName': 'MI9',  # 设备的名称,这个和后续的测试没有多大关系;
    'appPackage': 'io.momo.reve',  # 需要测试的app包名;
    'appActivity': 'io.momo.reve',  # 需要测试的app启动名;
    'unicodeKeyboard': True,  # 如果指定了UI2作为驱动,不需要配置;
    'resetKeyboard': True,  # 重置自动化时设置的键盘;
    'chromedriverExecutableDir': '路径',  # 启动webview的webdriver驱动
    'noReset': True,  # 防止每次启动app时候都初始化所有数据;
    'newCommandTimeout': 6000,  # 代码向appiumserver发送命令的延迟时间,单位是秒,不设置默认一分钟;
    'automationName': 'uiautomator2',  # 这个并不是所有应用都适配的,1.15.1以前默认是UI1,之后是默认UI2;
    'autoGrantPermissions': "True",  # 自动跳过授权
    'skipServerInstallation': 'True',
    'skipDeviceInitialization': 'True',  # 跳过安装AppiumSetting
}

driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)  # /wd/hub 路径是固定的,desired_caps是初始化设置的字典;
driver.implicitly_wait(10)  # 隐式等待和selenium的用法是一样的;

    1、元素定位单数形式和复数形式和selenium一样,复数形式返回的也是列表;

            driver.find_elements_by_id(“username”) # 根据id定位,即 resource-id 的值;

            driver.find_element_by_accessibility_id(‘unique name’) # 根据唯一id定位,即 contend-desc 的值;

            driver.find_element_by_class_name(“android.btn”) # 根据类名定位,即 class 的值;

            driver.find_element_by_xpath(“//元素类型[@属性=‘value’]”) # 根据xpath定位,即 xpath 的值;

            driver.tap([(1, 2), (3, 4)]) # 模拟手指点击坐标,tap里面最多有5个坐标,

    2、通过元素的百分比坐标来定位:

            target_size = driver.get_window_size() # 获取手机屏幕的尺寸

            height = target_size[“height”] # 获取手机屏幕 x 坐标

            width = target_size[“width”] # 获取手机屏幕 y 坐标

            driver.tap([(height / 2, width / 8)]) # 点击指定百分比坐标的位置
 

------------------------------------------------------------------------------------------

四、元素定位工具 - Uiautomatorviewer

    1、工具路径:

            一般在 /SDK/Tools/bin/uiautomatorviewer.bat 目录下,有的也会直接放在 /SDK/Tools/uiautomatorviewer.bat 目录下;

    2、工具缺点:

            高版本的安卓可能有兼容性问题,经常出现连接不上的问题,需要多次重启工具和adb;

    3、工具内容解释:

            index:元素的下标,在结构树上能看到;

            text:文本信息,不是每个元素都有;

            resource-id:元素的id,但这个id有可能不是唯一的(格式:“包名:id”);

            class:元素属于的类,安卓是java开发的,所以每个元素都有class,;

            package:app的包名;

            content-desc:这个可以唯一定位元素,通常开发都不会写;

            bounds:坐标值,通常有两个list,一个是左上角一个是右下角,如: [x1,y1][x2,y2]

 

------------------------------------------------------------------------------------------

五、UI Selector API 定位方法:

   1、通过ID来选择元素:

            new UiSelector().resourceId("string id") #此方法是java用法,能在appium定位工具里验证(括号里是一个参数)

    2、通过CLASS来选择元素:

            new UiSelector().className("string classname") #此方法是java用法,能在appium定位工具里验证(括号里是一个参数)

   3、通过content-desc来选择元素:

            new UiSelector().description("string id") #此方法是java用法,能在appium定位工具里验证(括号里是一个参数)

   注意:new 后面的空格只能是一个,否则会报错;

   4、通过xpath来选择元素,用uiselector来表示:

            new UiSelector().resourceId("string id").childSelector(new UiSelector().className("string classname"))
注意这个并非固定用法,.childSelector() 前的可以是任何appium定位方法,括号里的也是可以任何的appium定位方法;

如用选择xpath定位后的第 n 个元素:
            new UiSelector().resourceId("string id").childSelector(new UiSelector().className("string classname").instance(n))
注意:这里的 n 是从 0 开始的,0 既是第一个元素;

   5、通过正则表达式匹配id:

            new UiSelector().resourceIdMatches("id/digit\d") #注意这里的 \d 是正则表达式;

   6、通过文本来选择元素:

            new UiSelector().text("text")

   7、通过正则表达式选择文本:

            new UiSelector().textMatches("text\d") #注意这里的 \d 是正则表达式;

   8、UiSelector在appium代码中的写法:

            driver.find_element_by_android_uiautomator('''new UiSelector().resourceId("string id")''') # 单数形式

            driver.find_element_by_android_uiautomator('''new UiSelesctor().resourceId("string id")''') # 复数形式
 

------------------------------------------------------------------------------------------

六、操作页面:

   1、滑动:

            banner = driver.find_element_by_id(“”) # 先定位到需要获取尺寸的目标元素

            banSize = banner.size # 返回:{“height”: size[“height”], “width”: size[“width”]}

            eleHeight, eleWidth = banSize[“height”], banSize[“width”] # 获取元素的高度和宽度

            loc = banner.location # 获取元素的左上角坐标,返回:{“x”: round(old_loc[‘x’]), “y”: round(old_loc[‘y’])}

            startX, startY = loc + eleWidth * 0.2, loc + eleHeight * 0.5 # 获取起始坐标

            endX, endY = loc + eleWidth * 0.8, startY # 获取终点坐标

            driver.swipe(startX, startY, endX, endY, duration=None) # 滑动方法,duration是滑动消耗时间
 

------------------------------------------------------------------------------------------

七、通知查看:

   1、打开通知栏

            driver.swipe() # 通过滑动屏幕实现—从顶端向下滑动

            driver.open_notifications() # 固定用法,通过调用api来实现

   2、关闭通知栏

            driver.swipe() # 通过滑动屏幕实现—从底部向上滑动

            driver.press_keycode() # 括号里面填写相对应的按钮编码,短按操作

            driver.keyevent() # 相当于继承了selenium的方法,短按操作

            driver.long_press_keycode() # 长按按钮操作,括号里的输入对应按钮的编码

   3、按钮对应的编码 扩展:

            driver.press_keycode(5) # 拨号键

            driver.press_keycode(220) # 调节屏幕亮度的键

            driver.press_keycode(221) # 调节屏幕亮度的键

            driver.press_keycode(3) # home 键

            driver.press_keycode(82) # 菜单键

            driver.press_keycode(4) # 返回键

            driver.press_keycode(27) # 拍照键

            driver.press_keycode(26) # 电源键,点击一下相当于锁屏,长按相当于关机操作

            driver.press_keycode(91) # 话筒静音键

            driver.press_keycode(24) # 电源键,点击一下相当于锁屏,长按相当于关机操作

            driver.press_keycode(25) # 音量增加键

            driver.press_keycode(26) # 音量减小键

 

------------------------------------------------------------------------------------------

八、WebView

   1、打开电脑上的浏览器以手机模式执行

        前提:电脑浏览器能访问手机版的该网页!

from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("mobileEmulation", {"deviceName": "iPhone X"})  # 注意模拟的手机设备类型是浏览器里有的;
bro = webdriver.Chrome(desired_capabilities=chrome_options.to_capabilities())  # 启动webdriver添加配置项;

   如果要直接对app的webview进行测试,需要修改源码:

   准备工作1: app修改编译:对 webview对象加入 setWebContentsDebuggingEnabled 的调用!

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    WebView myWebView = (WebView) findViewById(R.id.jcywebview);
    myWebView.setWebContentsDebuggingEnabled(true);
}

   准备工作2: 查看webview元素

            通过chrome的远程调试功能—电脑需要翻墙

            打开chrome浏览器,地址栏输入:chrome://inspect

            Android 4.4(KitKat)或更高的版本

   准备工作3: 选择合适的webdriver

 

九、appium 实现 webview 自动化:

   如果需要操作webview的内容,必须要切入 context 里面去,否则无法定位到元素!

            driver.contexts # 查看你当前有那些context,返回的是一个列表;

            driver.current_context # 查看 driver 当前处于哪个 context;

            contextname = driver.contexts[0]

            driver.switch_to.context(contextname) # 切入 context 里面去;

有关Appium详解(超详细)的更多相关文章

  1. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  2. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

  3. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  4. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  5. H2数据库配置及相关使用方式一站式介绍(极为详细并整理官方文档) - 2

    目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式

  6. 华为ensp详细安装包、安装教程及所遇问题 - 2

    目录一、安装包链接二、安装详细步骤1.安装Wireshark和WinPcap2.安装OracleVMVirtualBox3.安装ensp三、安装后注册四、启动路由器出现40错误怎么解决一、安装包链接二、安装详细步骤链接:https://pan.baidu.com/s/1QbUUYMOMIV2oeIKHWP1SpA?pwd=xftx提取码:xftx1.安装Wireshark和WinPcap找到Wireshark安装包所在文件夹,双击它,按照以下步骤安装。2.安装OracleVMVirtualBox找到OracleVMVirtualBox安装包所在文件夹,双击它,按照以下步骤安装。注:可自定义安装

  7. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  8. 【Elasticsearch基础】Elasticsearch索引、文档以及映射操作详解 - 2

    文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就

  9. Linux操作系统CentOS7安装Nginx[详细版] - 2

    Nginx安装1.官网下载Nginx2.使用XShell和Xftp将压缩包上传到Linux虚拟机中3.解压文件nginx-1.20.2.tar.gz4.配置nginx5.启动nginx6.拓展(修改端口和常用命令)(一)修改nginx端口(二)常用命令1.官网下载Nginxhttp://nginx.org/en/download.html这里我下载的是1.20.2版本,大家按需下载对应稳定版即可2.使用XShell和Xftp将压缩包上传到Linux虚拟机中没有XShell可以参考《Linux操作系统CentOS7连接XShell》3.解压文件nginx-1.20.2.tar.gz1)检查是否存

  10. 最强Http缓存策略之强缓存和协商缓存的详解与应用实例 - 2

    HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。一.强缓存强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。常见的强缓存响应头如下所述:Cache-ControlCache-Control响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Ca

随机推荐