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

APP前置代码的更多相关文章

  1. JavaScript调用App原生代码(iOS、Android)通用解决方案

    实际场景 场景:现在有一个H5活动页面,上面有一个登陆按钮,要求点击登陆按钮以后,唤出App内部的登录界面,当登录成功以后将用户的手机号返回给H5页面,显示出来.这个场景应该算是比较完整的一次H5中的 ...

  2. HTML5 App的代码注入攻击

    原文链接 摘要 基于HTML5的手机app(译者注:以下简称HTML5 app)越来越流行了, 在大多数情况下它比native应用更容易适配不同的移动操作系统.它开发起来很方便,可以使用标准的web技 ...

  3. UI自动化前置代码

    一.前置代码: #导入包selenium from selenium import webdriverimport time#创键一个火狐对象driver=webdriver.Firefox()#防问 ...

  4. iOS App 无代码入侵的方法hook

    继续Objective-C runtime的研究 最近公司项目在做用户行为分析 于是App端在某些页面切换,交互操作的时候需要给统计系统发送一条消息 在几十个Controller 的项目里,一个一个地 ...

  5. DevOps on Android: 加速 App 从代码到上线

    DevOps 是一个众所周知的开发方法,其主要目的是自动化软件交付.事实上,DevOps 的目标是不断的测试,代码质量,功能开发,更容易维护版本.因此,DevOps 的一个最终目标是为开发者进行快速, ...

  6. 【如何快速的开发一个简单的iOS直播app】(代码篇)

    开篇([如何快速的开发一个完整的iOS直播app](原理篇)) 好久没写简书,因为好奇的我跑去学习直播了,今天就分享一下我的感慨. 目前为止直播还是比较热点的技术的,简书,git上有几篇阅读量和含金量 ...

  7. app前端代码打包步骤

    一.搭建项目环境 1.安装node.js 在网上找到nodejs压缩包,下载解压后安装node-v8.9.3-x64.msi文件. 安装完毕后,在windows的cmd控制台输入node -v或nod ...

  8. app分享代码

    友推是一款是面向移动应用的SDK分享组件,提供给开发者集成使用.通过友推,开发者可以轻松集成社会化分享功能,同时创建及管理推荐好友使用您应用的推荐奖励活动,用户推荐好友安装使用您的应用即可获得推荐奖励 ...

  9. java支付宝app支付-代码实现

    1.我们需要在支付宝商户平台配置好,取到四个参数如下(这是支付宝官方配置地址):https://www.cnblogs.com/fuzongle/p/10217144.html 合作身份者ID:123 ...

随机推荐

  1. tr:hover变色的问题

    做表格隔行变色(高亮显示),可以通过设置css中的 tr:hover伪类属性达到效果, 但是,会出一点小问题.td的背景色会覆盖tr的背景色, 在tr:hover下边加上一句:tr:hover td{ ...

  2. jmeter之关联的使用(正则、json)

    部分接口的测试中,一个接口会依赖上一个接口的响应信息,但上一个接口的响应信息又不是固定不变的,这时候,需要提取上一个接口的响应信息,将二者每一次的信息关联起来 目录 1.应用场景 2.jmeter正则 ...

  3. C++ 编写的DLL导出的函数名乱码含义解析

    C++编译时函数名修饰约定规则: __stdcall调用约定:   1.以"?"标识函数名的开始,后跟函数名:     2.函数名后面以"@@YG"标识参数表的 ...

  4. linux crontab 执行任务(7秒执行)

    创建的contab 文件中,每一行都代表一项任务,每行的每个字段代表一项设置.前五个字段是时间,第六个字段是要执行的命令 minute   hour   day   month   week   co ...

  5. AtCoder ABC 140D Face Produces Unhappiness

    题目链接:https://atcoder.jp/contests/abc140/tasks/abc140_d 题目大意 有一对 N 个人, 用字符串 S 表示, S[i] 如果等于 'L' 说明这个人 ...

  6. MySQL 查询语句--------------进阶9:联合查询

    #进阶9:联合查询 /* union 联合 合并:将多条查询语句的结果合并成一个结果 语法: 查询语句1 union 查询语句2 union..... 应用场景:要查询的结果来自于多个表,且多个表没有 ...

  7. 关于国内注册codepen。无法收到邮件问题的解决

    我刚刚使用的qq邮箱也无法收到.后来使用了@foxmail.com邮箱就可以了. 我记得以前注册国外的一些东西,使用qq邮箱也是无法收到. 你可以在qq邮箱里面注册一个英文邮箱.注册以后就是@foxm ...

  8. Learning OSG programing---Multi Camera in one window 在单窗口中创建多相机

    在学习OSG提供的例子osgCamera中,由于例子很长,涉及很多细节,考虑将其分解为几个小例子.本文介绍实现在一个窗口中添加多个相机的功能. 此函数接受一个Viewer引用类型参数,设置图形上下文的 ...

  9. JavaScript.import

    // --file.js-- function getJSON(url, callback) {   let xhr = new XMLHttpRequest();   xhr.onload = fu ...

  10. POJ-1611.TheSuspects.(并查集)

    The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 55832   Accepted: 26501 De ...