Appium之启动第一个App
搭建appium自动化环境真是各种问题呀。
如何启动在真机上启动App?
执行操作:操作Android真机上打开手机淘宝app,并搜索“熊猫”。
脚本源码如下:
from appium import webdriver
from time import sleep desired_caps = {
'autoLaunch': "True",
'platformName': "Android",
'deviceName': "VBJDU18509008035",
'platformVersion': "10.0",
'appPackage': "com.taobao.taobao",
'appActivity': "com.taobao.tao.welcome.Welcome",
'noReset': "True", # 启动app时不要清除app里的原有的数据。
"unicodeKeyboard": "True", # 使用unicode编码方式发送字符串(以便键盘输入中文)
"resetKeyboard": "True", # 在运行具有unicodeKeyboard功能的Unicode测试之后,将键盘重置为其原始状态。若单独使用,则忽略。(后需手动进入系统修改回原键盘输入法)
} driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
driver.find_element_by_xpath('//*[@resource-id="com.taobao.taobao:id/sv_search_view"]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.view.View[2]').click()
sleep(5) # 延迟,不然老报错未找到元素
driver.find_element_by_id("com.taobao.taobao:id/searchEdit").send_keys("熊猫")
driver.find_element_by_id("com.taobao.taobao:id/searchbtn").click()
# driver.find_element_by_xpath('//*[@resource-id="com.taobao.taobao:id/rv_main_container"]/android.widget.FrameLayout[4]/android.widget.FrameLayout[1]/android.support.v7.widget.RecyclerView[1]/android.widget.FrameLayout[3]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[2]').click()
# driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith("食品")').click() # 使用text属性
# driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith("宠物")').click()
Desired Capabilities常用关键字详解:
Desired Capabilities 在启动 session 的时候是必须提供的。Desired Capabilities 本质上是以 key value 字典的方式存放,客户端将这些键值对发给服务端,告诉服务端我们想要怎么测试。
(官方文档地址:https://appium.io/docs/en/writing-running-appium/caps/#appium-desired-capabilities)
| 关键字 | 描述 | 实例 |
| autoLaunch |
是否需要自动安装或启动应用。默认为True |
True或False |
| automationName | 想使用的自动化测试引擎 | Appium(默认)或Selendroid |
| platformName | 移动设备的操作系统 | iOS或Android或FirefoxOS |
| platformVersion | 移动设备操作系统的版本号 | 如10.0 |
| deviceName | 移动设备类型或者模拟器类型 | iPhone Simulator,iPad Simluator,Android Emulator等。(在Android上,这个关键字目前不起作用) |
| udid | 连接的物理设备的唯一设备标识 | 如VBJDU415DG3 |
| newCommandTimeout |
设置命令超时时间,单位:秒,默认值为60 (如果达到超时时间且仍未接受到新的命令时,appium-server会假设客户端退出然后自动结束会话。) |
如120 |
| autoWebview |
直接转换到Webview上下文。默认值 为False |
True,False |
| noReset | 不要要会话前清除应用状态。默认值为False | True,False |
| fullReset |
iOS:删除整个模拟器目录。 Android:通过卸载而不是清空数据来重置应用状态。 在Android上,这也会在会话结束后自动清除被测应用。默认值False。 |
True,False |
| browserName |
启动手机浏览器 |
iOS:Safari Android:Chrome,Browser |
| orientation | 设置移动设备的方向模式为横屏或竖屏 | LANDSCAPE (横向) 或 PORTRAIT (纵向) |
前提:已安装Android_SDK、python、appium-server等环境。
1、在手机安装待测app,同时电脑上也储存有该待测app;
2、手机与电脑通过USB连接,并打开【开发人员选项】,打开【USB调试】:
对于华为手机,进入【关于手机】,连续点击【版本号】7次,则提示“手机已处于开发者模式”;再进入【系统和更新】,即可看到【开发人员选项】,进入即可打开【USB调试】。
3、确保手机与电脑连接,进入cmd命令行,执行命令:adb devices,得到设备信息如下:

由于我的手机与电脑连接后,一直获取不到设备信息,后再电脑上下载安装360手机助手,再执行adb devices就可以获取到设备信息了,神奇!
4、执行命令:aapt dump badging E:\AndroidTest\xxx.apk(APK的全名,如手机淘宝.apk),获取app的appPackage和appActivity信息:


5、打开appium-server:
由于使用AppiumForWindows_1_4_16_1一直报错"Could not parse activity from dumpsys ",后重新安装Appium-desktop作为appium-server(下载地址为https://github.com/appium/appium-desktop/releases)

6、定位需要的元素:
由于使用Android_SDK自带的uiautomatorviewer工具时老是报错“ Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn't exist!”,后改用了weditor。
即uiautomator2,是一个自动化测试开源工具,仅支持Android平台的原生应用测试。
GitHub地址:https://github.com/openatx/uiautomator2。
安装:pip install --pre weditor
在浏览器上运行:python -m weditor

ps:adb如何无线连接手机的方法?(手机和电脑已处在同一网络下)
(1)进行cmd命令行,手机通过USB线连接到电脑,且手机打开USB调试;
(2)执行命令 :adb devices,查看设备连接情况:

(3)执行命令:adb tcpip 5555,开启手机的5555端口(默认端口,也可以用其他端口):

(4)执行命令:adb shell ip -f inet addr show wlan0,查看手机的ip地址:

(5)执行命令:adb connect ip:port,无线连接设备:

(6)再次执行命令:adb devices,可以看到 通过ip连接的设备:

常见问题及解决参考
问题1:使用appium在Android真机上测试时报错“command failed shell 'ps' uiautomator”?
解决参考:https://blog.csdn.net/pjl6523853/article/details/72886048
问题2:Android真机,每次启动都会安装appiumsetting和unlock?
解决参考:https://www.cnblogs.com/syw20170419/p/8358523.html
问题3:运行uiautomatorviewer.bat闪退?
参考解决:降低jdk版本(如版本Java SE Development Kit 8u261)。
问题4:uiautomatorviewer工具定位网页元素时报错“Error obtaining UI hierarchy”?
解决参考:https://www.wandouip.com/t5i337805/
(ps:没有试过...,改用weditor了。)
问题5:执行脚本时“An unknown server-side error occurred while processing the command. Original error: The instrumentation process cannot be initialized.”?
解决参考:执行脚本前,先关闭weditor,包括cmd窗口、浏览器窗口和ATX软件(停止所有服务),再重启Appium-server。
参考:https://www.cnblogs.com/poloyy/p/12679388.html
参考:https://www.cnblogs.com/yoyoketang/tag/appium/default.html
Appium之启动第一个App的更多相关文章
- Android项目实战(二十二):启动另一个APP or 重启本APP
一.启动另一个APP 目前公司项目需求,一个主APP,需要打开某些小APP,这些小APP是整合了Unity的,但是还是android程序(所有小APP的包名是已知的). 以前没做过,查询了一下实现方法 ...
- Android 一个app启动另一个app
最近,一个app启动另一个app,这个玩法挺火的嘛,有没有试过更新QQ到5.1版本,QQ的健康里面就可以添加其他app,实现从QQ跳转到其他app应用.这个挺好玩的,一下子带来了多少流量啊. 一.先来 ...
- ios 一个app启动另一个app
问题描述:需要从一个ios应用程序中,能启动另一个ios应用程序. 开发环境:xcode7.3.1 关键词:白名单(LSApplicationQueriesSchemes).注册自己的URL Demo ...
- Android在应用中依据包名启动另外一个APP
以下为TestIntentData工程 MainActivity如下: package cn.testintentdata; import java.util.List; import android ...
- Android启动另一个APP时,注意disable与enable的问题
在写游戏sdk时候遇到了一个需要在sdk中通过scheme来启动支付宝的免密支付功能,所以需要在设备中通过包名检查一下支付宝是否存在. 此时遇到了一个问题,在三星设备中可以将app给处于disable ...
- Android在一个APP中通过包名或类名启动另一个APP
开发有时需要在一个应用中启动另一个应用,比如Launcher加载所有的已安装的程序的列表,当点击图标时可以启动另一个应用.一般我们知道了另一个应用的包名和MainActivity的名字之后便可以直接通 ...
- 启动另一个app
(一) 通过包名.类名 开发有时需要在一个应用中启动另一个应用,比如Launcher加载所有的已安装的程序的列表,当点击图标时可以启动另一个应用.一般我们知道了另一个应用的包名和MainActivit ...
- Windows Phone 8 通过一个app启动另一个app
Winphone8 通过app启动第三方app需要被启动的app支持,具体操作步骤如下: 假设要通过PhoneApp2启动PhoneApp1 PhoneApp1端做的操作如下: 1.注册Protoco ...
- Android 中如何从一个App启动另外一个App(如启动支付界面、启动地图界面、应用商场下载App等场景)
假定两个App,分别是A和B,当A运行某个功能需要启动B,一种是启动B应用,一种直接进入B的某个Activity.搜了很多资料,没有一个完整的.下面就A--Android5.1.1.B--Androi ...
随机推荐
- # 火题小战 A.玩个球
火题小战 A.玩个球 题目描述 给你 \(n\) 种颜色的球,每个球有 \(k\) 个,把这 \(n\times k\) 个球排成一排,把每一种颜色的最左边出现的球涂成白色(初始球不包含白色),求有多 ...
- GaussDB基本操作
列出所有数据库 \l 切换数据库 \c ${databaseName} 列出当前数据库下的表 \d 列出表的所有字段 \d ${tableName} 查看指定表的基本情况 \d+ ${tableNam ...
- oracle中表加锁死锁的现象、原因及解决方案
一.表加锁.死锁出现的现象 1.对数据库操作update.insert.delete时候,数据库无法更新,操作等待时长,操作结果不发生改变: 2.在程序中,底层(数据访问层)操作时候不成功,数据库连接 ...
- A Case for Lease-Based, Utilitarian Resource Management on Mobile Devices
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! 以下是对本文关键部分的摘抄翻译,详情请参见原文. Abstract 移动应用程序已经成为我们日常生活中不可或缺的一部分,但许多应用程序的设 ...
- MyBatis源码分析之核心处理层
目录 1 传统方式源码剖析 1.1 初始化流程 1.2 执行SQL流程 1.2.1 获取SqlSession 1.2.2 执行SqlSession接口 1.2.3 执行Executor接口 1.2.4 ...
- 搜索会抓取网站域名的whoise信息吗
http://www.wocaoseo.com/thread-309-1-1.html 网站是否在信产部备案,这是不是会成为影响网站收录和排名的一个因素?百度是否会抓取域名注册人的相关whois信息吗 ...
- 时间转换c#
简要 本篇文章主要介绍基于.net(c#)封装的时间帮助类.主要功能是将时间戳与DateTime类型相互转换. 1.其中包括将毫秒级时间戳(13位).秒级时间戳(10位)转换为DateTime. 2. ...
- Promise对象入门
简介 promise对象可以获取异步操作的消息,提供统一的API,各个异步操作都可以用同样的方法进行处理. promise对象不受外界影响,其有三种状态:pending(进行中).fulfilled( ...
- 使用 Postman 做 API 自动化测试
Postman 最基本的功能用来重放请求,并且配合良好的 response 格式化工具. 高级点的用法可以使用 Postman 生成各个语言的脚本,还可以抓包,认证,传输文件. 仅仅做到这些还不能够满 ...
- 用aop去解决事物问题(tx)记录学习之aop1.2
上一个文章我们了解了什么事aop,以及aop的使用方法,主要是把自己想要加入的通知(advice)加入到我们的方法里, 比如上一章我们说的事把myadvice类中的before方法织入到userser ...