一、使用appium 打开app
想要使用自动化代码来控制APP,我们就需要用appium
1、连接移动端APP
首先打开Pycharm,我们输入
caps={
"platform":"android", #我们要链接的系统是安卓
"platformVersion":"9", #系统的版本是安卓9版本
"deviceName":"emulator-5554", #你连接的机器号
"noReset":True,
"appPackage":"com.tal.kaoyan", #你要打开的软件,这里填的是包名
"appActivity":".ui.activity.SplashActivity" #你打开的APP的活动窗口名
}
noReset这个参数是用来控制是否清除session信息的。
当不使用这个参数,默认为False的时候。如果上一个测试用例登录成功过了。下一个测试用例,在打开app时,进来的还是app打开的初始页面。是不会记录登录状态的
当使用这个参数,将至设置成True。如果上一个测试用例登陆成功了,下一个测试用例,在打开app时,进来的页面是登录成功后的页面。会保持登录状态
接下来我们连接移动端,模拟器或者真机
driver=webdriver.Remote("http://localhost:4723/wd/hub", caps)
localhost:4723 这块是IP地址和端口号,如果你是本地的模拟器就用localhost:4723,如果是真机就去看你手机的IP地址,然后加上这个端口
以上是连接APP的,我们同样可以连接移动端的浏览器
2、连接移动端浏览器
目前使用的安卓是谷歌在原生安卓基础上开发的,所以内置浏览器默认也就Chrom的内核,所以跟WEB自动化差不多的操作,接下来演示如何连接
我们首先要知道手机浏览器的版本号是多少,我们先打开手机或者模拟器的浏览器,然后打开电脑端的Chrom,在地址栏输入:
chrome://inspect/#devices
我们能看到这个页面,这个东西就是你的手机浏览器的版本号
然后我们输入这个链接去下载相关的东西
找到对应的版本下载
下载完成解压,直接把这个.exe文件拖到Pycharm中就行了
准备工作做完以后我们就能开始对浏览器进行操作了
caps={
"platformName": "Android",
"platformVersion": "9",
"deviceName": "emulator-5554",
"noReset": True
}
caps['browserName']='Browser'
caps['automationName']='UiAutomator2'
caps['chromedriverExecutable']=r"E:\app\APP_auto\chromedriver.exe" # r 防止转译
剩下的一些打开页面什么的,定位什么的都跟Web自动化一样
二、app元素定位
resource-id
其实就是通过By.ID 来定位
driver.find_element(By.ID,"login_email_edittext").send_keys("zhangtiedan1")
className
其实就是通过控件名来定位
driver.find_element(By.CLASS_NAME,'android.widget.EditText').send_keys("zhangtiedan1")
content-desc
其实就是通过By.Accessibility_id
某个元素属性: content-desc = “option_selected_icon”
上面的content-desc元素,可以有多种方式进行定位:
方式一:使用 find_element_by_accessibility_id 定位
driver.find_element(By.ACCESSIBILITY_ID,'option_selected_icon')
方式二:使用 find_element_by_android_uiautomator 定位
driver.find_element(By.ANDROID_UIAUTOMATOR,'new UiSelector().description("option_selected_icon")')
方式三:使用 xpath 定位
driver.find_element(By.XPATH, '//*[@content-desc="option_selected_icon"]')
xpath 通过By.XPATH
其实就是这个元素在页面中的空间的层次
driver.find_element(By.XPATH,"//android.widget.EditText[@text='请输入密码']").send_keys("zhangtiedan123")
通过UIAutomator方式来定位
常用的定位方式有:
id:对应Android属性的resource_id
driver.find_element(MobileBy.ANDROID_UIAUTOMATOR,"new UiSelector().resourceId(\"\")")
元素定位第一中方式resource-id,写法
ele = driver.find_element(By.ID,'com.tal.kaoyan:id/login_email_edittext')
text:对应Android的text
driver.find_element(MobileBy.ANDROID_UIAUTOMATOR,"new UiSelector().text(\"请输入密码\")").send_keys("zhangtiedan123")
classname:对应Android属性的class
driver.find_element(MobileBy.ANDROID_UIAUTOMATOR,"new UiSelector().className(\"android.widget.Button\")").click()
还可以使用text文本内容进行查找
driver.find_element(MobileBy.ANDROID_UIAUTOMATOR,"new UiSelector().text(\"请输入密码\")").send_keys("zhangtiedan123")
driver.find_element(MobileBy.ANDROID_UIAUTOMATOR,"new UiSelector().textContains(\"密码\")").send_keys("zhangtiedan3")
driver.find_element(MobileBy.ANDROID_UIAUTOMATOR,"new UiSelector().textStartsWith(\"登\")").click()
组合定位
一般组合用id、class、text这三个属性会比较好一点
例:id+class 属性组合
id_class = 'resourceId("com.xyh.commerce:id/ll_personal").className("android.widget.LinearLayout")'
driver.find_element(By.ANDROID_UIAUTOMATOR,id_class).click()
三、对手机的一些常用操控
这里就不只是对APP的操作了,就是模拟人对手机的一些操作了
caps={
"platformName": "Android",
"platformVersion": "9",
"deviceName": "emulator-5554",
"noReset": True
}
driver =webdriver.Remote("http://127.0.0.1:4723/wd/hub",caps)
不废话直接看代码
#捏屏幕(PINCH) (双指往内移动来缩小屏幕):对指定元素进行缩小
driver.pinch(element)
#zoom(放大:在某元素上执行放大操作):对指定元素进行放大
driver.zoom(element)
#滑动
driver.swipe(15,865,15,440,300)
#快速滑动
driver.flick(15,865,15,440)
#重置应用
driver.reset()
#手机屏幕息屏,时间是以秒为单位
driver.lock(5)
time.sleep(3)
#打开通知栏
driver.open_notifications()
time.sleep(2)
#返回通知栏
driver.press_keycode(4)
#点击手机上对应的按钮
driver.press_keycode(3)
#长时间点击手机上的某一个按钮
driver.long_press_keycode(keycode)
#安装apk
driver.install_app("F:\\BaiduNetdiskDownload\\app自动化工具\\mymoney.apk")
#用来检验是否安装那个应用没有,参数是应用的包名
b= driver.is_app_installed("com.tal.kaoyan")
print(b)
#根据包名和活动窗口打开某个应用
driver.start_activity("com.mymoney",".biz.splash.SplashScreenActivity")
#显示等待某个窗口的加载,等待最长时间为5秒,每0.5验证一次
driver.wait_activity(".biz.main.MainActivity",5,0.5)
#返回活动窗口
print(driver.current_activity)
#获得窗口后,让这个软件后台运行几秒
driver.background_app(5)
#删除对应的app 根据包名删除
driver.remove_app("com.mymoney")
driver.hide_keyboard(隐藏设备上的键盘)
#手指点击
driver.tap([(89,541),(346,541),(84,443)],300)
常用的操作就这些,重要的是上面的APP的各种定位方法