APP前置代码
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前置代码的更多相关文章
- JavaScript调用App原生代码(iOS、Android)通用解决方案
实际场景 场景:现在有一个H5活动页面,上面有一个登陆按钮,要求点击登陆按钮以后,唤出App内部的登录界面,当登录成功以后将用户的手机号返回给H5页面,显示出来.这个场景应该算是比较完整的一次H5中的 ...
- HTML5 App的代码注入攻击
原文链接 摘要 基于HTML5的手机app(译者注:以下简称HTML5 app)越来越流行了, 在大多数情况下它比native应用更容易适配不同的移动操作系统.它开发起来很方便,可以使用标准的web技 ...
- UI自动化前置代码
一.前置代码: #导入包selenium from selenium import webdriverimport time#创键一个火狐对象driver=webdriver.Firefox()#防问 ...
- iOS App 无代码入侵的方法hook
继续Objective-C runtime的研究 最近公司项目在做用户行为分析 于是App端在某些页面切换,交互操作的时候需要给统计系统发送一条消息 在几十个Controller 的项目里,一个一个地 ...
- DevOps on Android: 加速 App 从代码到上线
DevOps 是一个众所周知的开发方法,其主要目的是自动化软件交付.事实上,DevOps 的目标是不断的测试,代码质量,功能开发,更容易维护版本.因此,DevOps 的一个最终目标是为开发者进行快速, ...
- 【如何快速的开发一个简单的iOS直播app】(代码篇)
开篇([如何快速的开发一个完整的iOS直播app](原理篇)) 好久没写简书,因为好奇的我跑去学习直播了,今天就分享一下我的感慨. 目前为止直播还是比较热点的技术的,简书,git上有几篇阅读量和含金量 ...
- app前端代码打包步骤
一.搭建项目环境 1.安装node.js 在网上找到nodejs压缩包,下载解压后安装node-v8.9.3-x64.msi文件. 安装完毕后,在windows的cmd控制台输入node -v或nod ...
- app分享代码
友推是一款是面向移动应用的SDK分享组件,提供给开发者集成使用.通过友推,开发者可以轻松集成社会化分享功能,同时创建及管理推荐好友使用您应用的推荐奖励活动,用户推荐好友安装使用您的应用即可获得推荐奖励 ...
- java支付宝app支付-代码实现
1.我们需要在支付宝商户平台配置好,取到四个参数如下(这是支付宝官方配置地址):https://www.cnblogs.com/fuzongle/p/10217144.html 合作身份者ID:123 ...
随机推荐
- Scala从入门到放弃(三)Scala的数组、映射、元组和集合
1.数组 1.1定长数组和变长数组 object ArrayDemo { def main(args: Array[String]): Unit = { //初始化一个长度为8的定长数组,其数组元素均 ...
- IBatis.Net 下使用SqlBulkCopy 大批量导入数据 问题解决
SQLBulkCopy是继承SQLClient空间下的一个特殊类,它可以帮助我们以映射的方式把DataTable和DataReader数据大批量导入到数据库对应表中 public void Inert ...
- 1207D Number Of Permutations
题目大意 给你n个二元组 问你有几种排列是的按两个关键字中的任意一个都不是不降排列的 分析 不妨容斥 我们先加上总的方案数$n!$ 之后我们按第一个关键字排序 因为值相同的情况下不影响答案 所以让总方 ...
- nas请求响应示意图
curl nginx(proxy_connect) nginx(NAS) | | | | | | (1) |-- CONNECT 443 -> | | | | | | |---- [ TCP c ...
- CentOS7.4伪分布式搭建 hadoop+zookeeper+hbase+opentsdb
前言 由于hadoop和hbase都得想zookeeper注册,所以启动顺序为 zookeeper——>hadoop——>hbase,关闭顺序反之 一.前期准备 1.配置ip 进入文件编辑 ...
- Web控件中Eval()的使用
1.使用Eval()绑定数据时使用三元运算符 <%#Eval("hg_A").ToString()=="1"?"通过":Eval(&q ...
- Winsows10-1909正式版原版下载资料
[简体中文版] 一.win10 1909消费者版(零售版),含家庭版.家庭单语言版.教育版.专业版.专业教育版.专业工作站版 (6个版本) 1.64位系统:Windows 10 (consumer e ...
- c# 调用 webService
开局几张 照着做就完事 说明下 这个wsdl 文件是根据别人提供的webService 接口 打开后改变后缀来的 这样就引用完成了 接下来就是重点了 怎么调用 localhost.WsSyncDu ...
- Yaconf – 一个高性能的配置管理扩展
鸟哥出品:http://www.laruence.com/2015/06/12/3051.html 首先说说, 这个是干啥的. 我见过很多的项目中, 用PHP文件做配置的, 一个config目录下可能 ...
- PowerShell - Invoke VBA function
$xl = new-object -comobject Excel.Application $source_wb = $xl.workbooks.open($source) $xl.visible=$ ...

