appium桌面版本以及一些自动化测试方方封装
appium_desktop
标签(空格分隔): appium_desktop
一 appium_desktop_v1.2.6
1.appium_desktop在github上最新下载地址:appium桌面版本地址
2.一路傻瓜式安装就好了:
3.然后点击搜索按钮(右上角)
三 inspector
1.元素定位探测器,在Desired Capabilitis下表格输入参数配置信息:
"platformName": "Android",
"deviceName": "8681-M02-0x253b1876",
"platformVersion": "5.1",
"appPackage": "com.zhan.toefltom",
"appActivity": "com.zhan.toefltom.SplashActivity",
"app": "F:\\特殊处理包H5\\toefl_V2.1.0_071610_release.apk"
2.参数配置好之后可以保存下,连接手机,再点Start Session按钮就能定位元素了
3.用上图导航栏的箭头按钮,定位左边app的元素属性
四 弹出框的坑
1.这里有个坑,这种弹出框的元素无法定位到,需要用UI Automator Viewer这个工具才能定位到
五 对比分析
inspector优点
appium自带的inspector可以查看xpath路径,对比xpath不熟悉的同学可以很好的帮助
inspector缺点
1.有些弹出框的元素无法定位到
2.过分依赖工具匹配出来的xpath会让你变懒,形成对工具的依赖
总结:xpath实际上是定位的下下策,能不用尽量不用,另外不要一直复制xpath粘贴,那对你定位一点帮助也没有,想用xpath的同学,多学习语法,自己去写!
六:如果定位的过程你使用了全部的招数都无法定位到元素:
so:那就要使用坐标定位了
七:定位坐标
如图我们可以看到对应的坐标的属性
android特有的wait_activity属性
在启动app的时候,如果直接做下一步点击操作,经常会报错,于是我们会在启动完成的时候加sleep。
那么问题来了,这个sleep时间到底设置多少合适呢?设置长了,就浪费时间,设置短了,就会找不到元素报错了,这个时候我们可以用wait_activity的语法,等到你想点击的页面activity出现了,再点击,可以有效的节省时间。
- wait_activity(self, activity, timeout, interval=1):
等待指定的activity出现直到超时,interval为扫描间隔1秒
即每隔几秒获取一次当前的activity, android特有的
返回的True 或 False
activity - 需等待的目标 activity
- timeout - 最大超时时间,单位是s
- interval - 循环查询时间
用法:driver.wait_activity(‘.activity.xxx’,5,2)
- 二、获取current_activity
1.打开app后,先sleep10秒,等app完全启动完成进入主页面,然后获取当前界面的activity
from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import time
from time import sleep
import datetime
desired_caps = {
"platformName": "Android",
"deviceName": "8681-M02-0x253b1876",
"platformVersion": "5.1",
"appPackage": "com.zhan.toefltom",
"appActivity": "com.zhan.toefltom.SplashActivity"
}
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
ac =driver.current_activity
print(ac)
等待activity
1.用sleep太浪费时间了,并且不知道什么时候能启动完成,所以尽量不用sleep
2.上一步已经获取当主页面的activity了,那就可以用wait_activity等它出现了,再做下一步的点击操作
新版本的appium不支持name定位了:
- 一、 name定位报错
1.最新版appium V1.7用name定位,报错:
selenium.common.exceptions.InvalidSelectorException: Message: Locator Strategy 'name' is not supported for this session
2.这个报错是说name这个定位方法目前已经不支持了,因为appium从1.5版本开始就已经抛弃了name这种定位方法了。
- 二、 xpath定位
1.既然name定位抛弃了,那就说明有更先进的定位代替了它,事实上xpath定位里面已经包含了name这种定位方法。
2.平常用过selenium,在定位页面上文本的时候,应该知道这个xpath语法:
//*[text()='页面text文本']
appium里面的xpath语法跟selenium有一点点区别:
//*[@text='页面text文本']
- 三、 text属性
1.上面的xpath语法适合页面上这个text属性是唯一的,才好直接定位到,那么问题来了:如果页面上有多个text属性的文本一样,怎么办?
2.xpath语法里面*是代表匹配任意的值,在selenium里面*是匹配任意标签,appium里的*是匹配任意class名称,如果几个文本的class属性不一样,就可以通过以下组合:
//android.widget.TextView[@text='小说']
toast提示消息判断
- 1.查看appium v1.7版本官方文档
2.目前1.7的android版可以支持:Espresso、UiAutomator2、UiAutomator、Selendroid四种驱动模式
UiAutomator2是目前最稳的。
- 二、toast定位
1.先看下toast长什么样,如下图,像这种弹出来的消息"再按一次退出",这种就是toast了。
2.想要定位toast提示:
需要:
from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep
desired_caps = {
'platformName': 'Android',
'deviceName': '***',
'platformVersion': '4.4.2',
'appPackage': '*****',
'appActivity': '****',
'noReset': 'true',
'automationName': 'Uiautomator2'
}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
# 等主页面activity出现
driver.wait_activity(".****", 10)
driver.back() # 点返回
# 定位toast元素
toast_loc = ("xpath", ".//*[contains(@text,'再按一次退出')]")
t = WebDriverWait(driver, 10, 0.1).until(EC.presence_of_element_located(toast_loc))
print t
上述:***自行测试中填写自己的内容
3.打印出来的结果,出现如下信息,说明定位到toast了
<appium.webdriver.webelement.WebElement (session="02813cce-9aaf-4754-a532-07ef7aebeb88", element="339f72c4-d2e0-4d98-8db0-69be741a3d1b")>
封装toast判断:
1.有时候我们需要单独封装一个方法来判断toast是否存在,存在返回True,不存在返回False
3.打印出来的结果,出现如下信息,说明定位到toast了
def is_toast_exist(driver,text,timeout=30,poll_frequency=0.5):
# driver - 传driver
#text - 页面上看到的文本内容
#timeout - 最大超时时间,默认30s
#poll_frequency - 间隔查询时间,默认0.5s查询一次
try:
toast_loc = ("xpath", ".//*[contains(@text,'%s')]"%text)
WebDriverWait(driver, timeout, poll_frequency).until(EC.presence_of_element_located(toast_loc))
return True
except:
return False
if __name__ == "__main__":
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
# 等主页面activity出现
driver.wait_activity(".base.ui.MainActivity", 10)
driver.back() # 点返回
# 判断是否存在toast-'再按一次退出'
print is_toast_exist(driver, "再按一次退出")
list定位:
当你定位元素的时候发现页面元素不唯一的时候,怎么办,这时候我们可以通过find_elements等list的取值来获取自己想要的元素,然后进行操作;
find_element有13种定位
find_elements也有13种
driver.find_elements_by_id("***")[0].click()
android_uiautomator
- appium的前身就是封装android的uiautomator这个框架来的,所以uiautomator的一些定位方法也可以用;
text
1.通过text文本定位语法
new UiSelector().text("text文本")
2.文本比较长的时候,可以用textContains模糊匹配,只要文本包含匹配内容就可以了。
new UiSelector().textContains("包含text文本")
3.textStartsWith是以某个文本开头的匹配
new UiSelector().textStartsWith("以text文本开头")
4.正则匹配textMatches,这个需要配合正则表达式,就不举例了。
new UiSelector().textMatches("正则表达式")
#等主页面activity出现
driver.wait_activity(".base.ui.MainActivity", 10)
loc_text = 'new UiSelector().text("图书")'#text内容
driver.find_element_by_android_uiautomator(loc_text).click()
loc_textContains = 'new UiSelector().textContains("图")'#textContains
driver.find_element_by_android_uiautomator(loc_textContains).click()
loc_textStart = 'new UiSelector().textStartsWith("图")'#textStartsWith
driver.find_element_by_android_uiautomator(loc_textStart).click()
className
1.页面上的class属性一般不唯一,多半用在复数定位时候。比如通过class属性定位'排行'这个按钮下标就是2。
new UiSelector().className("className")
2.className复数定位loc_class = 'new UiSelector().className("android.widget.TextView")'driver.find_elements_by_android_uiautomator(loc_class)2.click()
3.escription
1.由于这个app的contenet-des属性都是空的,就不用代码演示了,跟上面方法一样。
new UiSelector().description("contenet-des属性")
android_uiautomator定位进阶
上一篇介绍uiautomator的定位方式都是类似这种'new UiSelector().xxx("xxx")',看起非常长,我也记不住,怎样去除呢?
一、组合定位
1.一般组合用id,class,text这三个属性会比较好一点,其次description这个属性也可以一起两两组合
2.id与text属性组合
2.id与text属性组合
# id+text
id_text = 'resourceId("com.baidu.yuedu:id/webbooktitle").text("小说")'
driver.find_element_by_android_uiautomator(id_text).click()
3.class与text属性组合
sleep(2)
#class+text
class_text = 'className("android.widget.TextView").text("图书")'
driver.find_element_by_android_uiautomator(class_text).click()
4.其它更多组合,id,class也可以与其它的index,checkable,clickable,password等这些不常用的属性组合
二、 父子定位childSelector
1.有时候不能直接定位某个元素,但是它的父元素很好定位,这时候就先定位父元素,通过父元素找儿子。
#父子关系childSelector
son = 'resourceId("com.baidu.yuedu:id/rl_tabs").childSelector(text("小说"))'
driver.find_element_by_android_uiautomator(son).click()
三、兄弟定位:
# 兄弟关系fromParent
brother = 'resourceId("com.baidu.yuedu:id/lefttitle").fromParent(text("图书"))'
driver.find_element_by_android_uiautomator(brother).click()
长按操作:
长按long_press
1.长按的操作可以用前面讲到的TouchAction类里面的long_press方法操作
def long_press(self, el=None, x=None, y=None, duration=1000):
长按操作,可以传定位的元素对象,也可以传坐标
el 是定位元素的对象
x,y是传坐标
duration是按住的持续时间,默认1000,单位是毫秒
2.实现方法
TouchAction(driver).long_press(el).perform()#长按
el = driver.find_elements_by_id("com.tencent.mm:id/apv")[0]
# 长按
TouchAction(driver).long_press(el).perform()
time.sleep(3)
appium桌面版本以及一些自动化测试方方封装的更多相关文章
- appium+python做移动端自动化测试
1 导言 1.1 编制目的 该文档为选用Appium作为移动设备原生(Native).混合(Hybrid).移动Web(Mobile Web)应用UI自动化测试的相关自动化测试人员.开发人员等提供 ...
- Windows下安装appium桌面版和命令行版
安装appium桌面版和命令行版 一 桌面版(打开很慢,常用于辅助元素定位) 1.官网下载window版本: github search appium desktop download late ...
- Ubuntu桌面版本和服务器版本之间的区别(转载)
转载自:http://blog.csdn.net/fangaoxin/article/details/6335992 http://www.linuxidc.com/Linux/2010-11/297 ...
- appium安卓自动化的 常用driver方法封装
appium安卓自动化的 常用driver方法封装 做安卓自动化的时候,很多方法写起来会造成代码冗余,把这部分封装起来 ,添加到androidUI工具类里,随时可调用 都放在这个类下面: @Compo ...
- appium自动化测试框架——封装获取设备信息类
在上一节中,我们已经解决了如何在python中执行cmd,并获取执行结果.下面就小小实战一下,获取设备信息. 一.思路 1.windows上获取设备信息的方法 输入dos命令“adb devices” ...
- 安装appium桌面版和命令行版
一 桌面版(打开很慢,常用于辅助元素定位) 1.官网下载window版本: 2.直接点击紫色图标即可打开 3.启动server 二 命令行版(打开很快,常用于执行脚本) 1.jdk 安装jdk并 ...
- appium desktop 版本发布
Appium Desktop is an open source app for Mac, Windows, and Linux which gives you the power of the Ap ...
- appium桌面版和命令行版的安装
一.appium桌面版: 启动很慢,一般用于元素定位 Appium-Desktop官方下载地址:https://github.com/appium/appium-desktop/releases/ ( ...
- 使用Appium进行微信公众号自动化测试
查看Android的webview视图版本:手机链接电脑后在电脑Chrome打开页面chrome://inspect/#devices查看Android的Chrome内核版本 下载与该版本相对 ...
随机推荐
- github构建个人网站模板
http://novoland.github.io/%E5%B9%B6%E5%8F%91/2014/09/11/ThreadLocal%20%E5%88%86%E6%9E%90.html
- Loadrunner:win10下Vuser 运行脚本通过,Controller执行用户并发报错
现象:win7安装LR可以正常使用,将win7升级到win10之后,运行场景之后报错:Error (-81024): LR_VUG: The 'QTWeb' type is not supported ...
- <转载>http头 http://www.cnblogs.com/meil/archive/2007/03/06/665843.html
HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616.HTTP协议采用了请求/响应模型.客户 ...
- mybatis三(关联查询)
一.类属性 @Alias("depart")public class Department { private Integer id; private String departN ...
- centos7.5安装golang
1.下载 [root@localhost bin]#wget https://dl.google.com/go/go1.10.2.linux-amd64.tar.gz [root@localhost ...
- AspxCallback和AspxCallbcakPanel区别
AspxCallback是一个无界面控件,主要功能是启动一个回调,进行数据交互,而AspxCallbcakPanel为一个容器控件,可以在里面添加控件,并且可以局部刷新AspxCallbcakPane ...
- Xshell 用鼠标选中一段文字后自动换行
现象: 使用Xshell连接远程服务器,一般选中都是鼠标选中,然后按快捷键 Ctrl+Insert复制,Shift+Insert粘贴. 可是当选中后松开鼠标,这时候仿佛在xshell里自动输了一个回车 ...
- OWASP安全编码规范快速参考指南
0x00 原则 概览 开发安全的软件需要对安全原则有基本的了解.虽然对于安全原则的全面评估超出了本指南的范围,但是我们还是提供了一个快速的概览.软件安全的目标是要维护信息资源的 保密性 , 完整性 ...
- django组件:中间件
全局性的逻辑处理 一.中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨 ...
- TWebBrowser控件彻底防止弹出新窗口
最近在编写一个使用到TWebBrowser控件的软件,浏览网页时经常会弹出各种各样的窗口,尤其是广告,让人烦不胜烦,参考网上的一些资料,针对不同的弹窗方式采取相应的措施就能禁止各种弹窗. 1. 将TW ...