APP自动化前置代码:
#导入包
from appium import webdriver
import time
desired_caps = {}
desired_caps['platformName'] = 'Android' # Android系统 or IOS系统
desired_caps['platformVersion'] = '6.0.1' # Android系统版本
desired_caps['deviceName'] = '1' # (安卓随便写,苹果的写系统的型号)
desired_caps['appPackage'] = 'com.android.settings' # APP真机包名
desired_caps['appActivity'] = 'com.oppo.settings.SettingsActivity' # APP启动微信Activity
desired_caps['noReset'] = True # 每次打开APP不开启重置,否则每次都进入四个欢迎页
desired_caps["unicodeKeyboard"] = True #解决中文不能 输入
desired_caps["resetKeyboard"] = True # 隐藏键盘
driver = webdriver.Remote('http://localhost:4723/wd/hub',desired_caps) # 启动APP
#等待时间
time.sleep(3)
二、ID定位:
#通过ID找到元素
ele = driver.find_element_by_id("android:id/icon")
ele.click()
三、class定位:
#通过class定位
ele = driver.find_element_by_class_name("android.widget.TextView")
ele.click()
四、xpath定位:
属性和值定位:
ele= driver.find_element_by_xpath('//*[@content-desc="搜索"]')
# a1=driver.find_element_by_xpath("//*[@text='更多']")
# a2=driver.find_element_by_xpath("//*[@resource-id = 'com.android.settings:id/title']")
ele.click()
五、多元素定位(比单元素多了S,其他都一样)
# eles = driver.find_elements_by_id("com.android.settings:id/title")
el=driver.find_elements_by_class_name("android.widget.TextView")
print(el)
print(type(el))
print(len(el))
六、显示等待:
#15秒内 ,每0.5秒去查找
#导包 from selenium.webdriver.support.wait import WebDriverWait
#15秒内 ,每0.5秒去查找
wew = WebDriverWait(driver,15,0.5).until (lambda y:y.find_element_by_xpath('//*[@content-desc="搜索"]'))
wew.click()
六、元素操作
aa.click()#点击
a1.send_keys("我是勤奋的人啊 ,努力 有错吗hhhh")#输入文字
time.sleep(4)#暂停4秒
a1.clear()#清空输入
七、获取元素的属性
#获取 元素的属性值四种:print(i.get_attribute("name"))
eles = driver.find_elements_by_class_name("android.widget.TextView")
for i in eles:
print(i.get_attribute("name"))
print("--------------------")
for i in eles:
print(i.get_attribute("text"))
print("--------------------")
for i in eles:
print(i.get_attribute("className"))#主意N要大写
print("--------------------")
for i in eles:
print(i.get_attribute("resourceId"))#注意I要大写
print("--------------------")
八获取屏幕的坐标
#获取屏幕上的坐标:print(ss.location)
ss = driver.find_element_by_id("com.android.settings:id/search")
print(ss.location)
九、获取包启动名,再打开 其他 应用
#获取包名
print(driver.current_package)
#获取启动名
print(driver.current_activity)
#卸载应用(需要包名)
driver.remove_app("sogou.mobile.explorer")
#安装应用(需要路径)
driver.install_app("package:/system/app/BackupAndRestore")
显示当前页面的html代码
print(driver.page_source)
#5秒返回#App放置后台模拟热(APP暂停5秒在次展示当前的页面)
driver.background_app(5)
打开其它应用程序(填入包名和启动名)
driver.start_activity("com.android.mms","com.android.mms.ui.ConversationList")
#关闭(但不关闭驱动)
driver.close_app()
#退出(关闭驱动)
driver.quit()
#10、滑动事件1(往下滑500:driver.swipe(100,1000,100,500))
根据坐标滑动,后面5000是加个滑动时间5秒
#声明driver对象
driver = webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
#滑动事件(往下滑500)
driver.swipe(100,1000,100,500,5000)
11滑动事件2(从存储滑到更多:driver.scroll(an,an1))
根据属性滑动,有惯性
注意:滑动是从下往上滑动《存储在下面,更多在上面》
an = driver.find_element_by_xpath("//*[contains(@text,'存储')]")
an1= driver.find_element_by_xpath("//*[contains(@text,'更多')]")
#从存储 滑到更多
driver.scroll(an,an1)
12、拖拽事件3(从存储滑动更多:driver.drag_and_drop(an,an1))
根据属性滑动,没有惯性
注意:滑动是从下往上滑动《存储在下面,更多在上面》
an = driver.find_element_by_xpath("//*[contains(@text,'存储')]")
an1= driver.find_element_by_xpath("//*[contains(@text,'更多')]")
#从存储 滑到更多两个都可以用
driver.drag_and_drop(an,an1)
13滑动总结:
an = driver.find_element_by_xpath("//*[contains(@text,'存储')]")
an1= driver.find_element_by_xpath("//*[contains(@text,'更多')]")
driver.drag_and_drop(an,an1)
an2= driver.find_element_by_xpath("//*[contains(@text,'用户')]")
driver.drag_and_drop(an,an2)
#从存储滑到更多可以,从存储滑到 用户不行,需要重新定位元素存储。
#从存储 滑到更多,往下滑了三遍
driver.drag_and_drop(an,an1)
driver.drag_and_drop(an,an1)
driver.drag_and_drop(an,an1)
14、判断是否找到元素(翻页下滑查找元素):(找到为tu,找 不到fs)
while True:
try:
driver.find_element_by_xpath("//*[contains(@text,'关于平板电脑')]").click()
break
except Exception:
# 翻页往下翻页5秒钟找到“关于平板电脑”找不到就一直华东5秒钟
driver.swipe(100,1000,100,500,5000)
#所有关于手机界面的文本框
eles = driver.find_elements_by_class_name("android.widget.TextView")
#判断i。text里面有没有找到5.1这个元数
for i in eles:
#i每一个元素
#if i.text == "5.1":
if "5.1" in i.text:
print("有!")
break
else:
print("没有!")
15、轻敲(点击3种方试)
#导入包TouchAction
from appium.webdriver.common.touch_action import TouchAction
ss=driver.find_element_by_xpath("//*[contains(@text,'更多')]")
#轻敲(方法1)tap
# TouchAction(driver).tap(ss).perform()
# TouchAction(driver).tap(ss,600,600).perform()
TouchAction(driver).tap(x=850,y=1500).perform()
#轻敲2(方法2)press
# TouchAction(driver).press(ss).release().perform()
# TouchAction(driver).press(x=564,y=825).release().perform()
16、长按(#长按WLA:long_press)
ss=driver.find_element_by_xpath("//*[contains(@text,'WLA')]")
ss.click()
#长按WLA:long_press(方法1)
TouchAction(driver).long_press(ss).perform()
#长按WLA:long_press(方法2)
TouchAction(driver).press(ss).perform()
17、长按 后松手
ouchAction(driver).press(x=1000,y=1000).wait(5000).release().perform()
18、如何查看手机(真机的坐标)
手机关于手机---版本号:长按--进入开发 者模式--打开指针位置
19、图案解锁
#图案解锁:move_to
TouchAction(driver).press(x=148,y=522).move_to(x=447,y=522).
move_to(x=748,y=522).move_to(x=748,y=812).
move_to(x=454,y=1125).move_to(x=150,y=819).release().perform()
#tap轻敲
#press按下
#long_press长按
#wait等待
#release松手
#perform执行
#知道什么是 链条
#一堆动作 通过 动作 、动作、动作。perform这一串动作就是链条
#关于代码过长,在代码后加回车
20、获取当前时间和分辨率
#获取手机时间
print(driver.device_time)
#获取当前手机的分辨率
print(driver.get_window_size())
21、第二种滑动找元素(屏幕 的 宽来滑动这样就不会滑过头,漏掉元素):
while True:
try:
driver.find_element_by_xpath("//*[contains(@text,'关于平板电脑')]").click()
break
except Exception:
# 翻页:先查找手机的宽高
window_width = driver.get_window_size()["width"]
window_height = driver.get_window_size()["height"]
# print(window_width)#输出900
# print(window_height)#输出1600
start_x = window_width * 0.5
end_y = window_height * 0.25
start_y = end_y * 3
end_x = start_x
driver.swipe(start_x,start_y,end_x,end_y,5000)
#所有关于手机界面的文本框
eles = driver.find_elements_by_class_name("android.widget.TextView")
# #判断i。text里面有没有找到5.1这个元数
for i in eles:
#i每一个元素
#if i.text == "5.1":
if "5.1" in i.text:
print("有!")
break
else:
print("没有!")
附录:
#快捷键windows
#home + end 最左最右 shift选中 control 一个
22、发送键:driver.keyevent()
#循环3次,音量加三次(注意先看有 没有设置免打扰模式)
for i in range(3):
driver.keyevent(24)
time.sleep(1)
#音量减
driver.keyevent(25)
为什么加音量是24,减音量键是25;详细请看网站:https://wenku.baidu.com/view/e7d87f87c1c708a1294a440b.html
23、打开 通知栏:driver.open_notifications()
#打开通知栏
driver.open_notifications()
24、获取 当前网络
#获取 当前网络
# print(driver.network_connection)
25,设置 当前网络(设置飞行模式)
#设置 当前网络(设置飞行模式)方法1
# driver.set_network_connection(1)
# #设置 当前网络(设置飞行模式)方法2
必须先导包:
from appium.webdriver.connectiontype import ConnectionType
# driver.set_network_connection(ConnectionType.ALL_NETWORK_ON)
26.截图
#截图当前页面,保存到当前目录
driver.get_screenshot_as_file("./aa.png")
27APP自动化参数化:
#参数化需要导入import pytest;content是变量名,hello,和123456是输入值 系统会自动运行两次
@pytest.mark.parametrize("content",["hello","123456"])
28、adb命令的使用:
启动要查看的程序,命令查看当前运行的包名和Activity;windows下用下面这两个:
使用查看启动包方法1:adb shell dumpsys window | findstr mCurrentFocus
查看启动名和包名方法2:adb shell dumpsys window | findstr mFocusedApp
Mac和Linux系统下用:adb shell dumpsys window windows | grep mFcousedApp
启动:adb start-server
关闭:adb kill-server
获取设备:adb devices
adb帮助:adb --help
获取系统版本:adb shell getprop ro.build.version.release
卸载手机APP:adb uninstall 包名(com.experitest.simplebrowser)
获取App启动时间:adb shell am start -W com.experitest.simplebrowser/.WebViewActivity
TotalTime: 5778(主毫秒要看这个单位)
设备的型号IOS:instruments -s devices
设备的型号Android: adb devices
29.python需要安装的库:
自动化需要安装的库有:
安装pytest和allure: pip install pytest 和 pip install allure-pytest
cmd执行如下命令:
安装selenium和Appium: pip install selenium
pip install Appium-Python-Client
Python解析yaml文件:下载安装如下:
pip3 install -U PyAML
pytest生成报告的插件: pip install pytest-html
卸载安装:
pip uninstall (库名)
查看:pip list
安装键盘事件库:pip install PyUserInput