appium desktop
Appium-desktop 下载地址:https://github.com/appium/appium-desktop/releases
一般功能
这些能力跨越多个驱动因素。
仅限Android
这些功能仅适用于基于Android的驱动程序(例如 UiAutomator2)。
仅限iOS
这些功能仅适用于XCUITest驱动程序和过时的UIAutomation驱动程序。
appium调用应用
1、调用已安装的包
from appium import webdriver
from time import sleep
desired_caps = {
'platformName': 'Android',
'deviceName': 'B7E0117228000104',
'platformVersion': '7.0',
'adbPort' : '5148',
'appPackage':'com.android.calculator2',
'appActivity':'com.android.calculator2.Calculator'
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
driver.find_element_by_id("com.android.calculator2:id/digit_1").click()
driver.find_element_by_id("com.android.calculator2:id/digit_5").click()
driver.find_element_by_id("com.android.calculator2:id/digit_9").click()
driver.find_element_by_id("com.android.calculator2:id/del").click()
driver.find_element_by_id("com.android.calculator2:id/digit_9").click()
driver.find_element_by_id("com.android.calculator2:id/digit_8").click()
driver.find_element_by_id("com.android.calculator2:id/op_add").click()
driver.find_element_by_id("com.android.calculator2:id/digit_6").click()
driver.find_element_by_id("com.android.calculator2:id/op_div").click()
driver.find_element_by_id("com.android.calculator2:id/digit_8").click()
driver.find_element_by_id("com.android.calculator2:id/eq").click()
sleep(3)
driver.quit()
2、安装并调用未安装的包
{
"platformName": "Android",
"platformVersion": "7.0",
"deviceName": "FFK0116B30000505",
"app": "D:\\weixin.apk",
"noReset": true,
"adbPort": "5148"
}
Appium的基本使用
appium下包含2个包,common和webdriver,common下仅有一个exceptions,appium.common.exceptions所有appium中可能发生的异常。
其他操作及功能都在webdriver下:common、mobilecommand、webdriver、webelement。
1、app对象
Appium使用adb来与目标机器通讯,因此对于真机和模拟器操作几乎都是相同的,如何建立模拟器在此不再赘述。在Appium GUI点击 Launch 就可以启动 Appium Server。Appium Server 默认会监听
http://localhost:4723用于RPC通讯。dr为当前正在活动的 activity 对象,可以使用findElementByXXX 的方法来获取 Activity中的元素。所有Element后带s的函数,均获得所有匹配的元素,不带s的函数获得第一个匹配的元素。
from appium import
webdriver
desired_caps = {}
desired_caps['platformName'] = 'Android' #测试平台
desired_caps['platformVersion'] = '5.1' #平台版本
desired_caps['deviceName'] = 'm3_note' #设备名称,多设备时需区分
desired_caps['appPackage'] = 'com.tencent.mm' #app package名
desired_caps['appActivity'] = '.ui.LauncherUI' #app默认Activity
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) #启动Remote RPC
WebDriver对象的方法和属性:
driver.page_source #获取当前页面的源
driver.get_screenshot_as_file('/Screenshots/foo.png')
#获取截图存入指定的路径
driver.get_window_size(windowHandle='current')
#获取手机屏幕分辨率
driver.set_window_size(width,height) #设置屏幕分辨率
driver.orientation #获取方向
driver.orientation = 'landscape' #设置方向
driver.def desired_capabilities() #返回 设定的运行参数
driver.get_window_position()# 获取当前坐标位置
driver.find_element_by_定位方式(value)
#查找元素
driver.find_element(by. 定位方式,"ag2") #查找元素,需from
selenium.webdriver.common.by import By
输入操作
driver.scroll(el1,el2) #点击/触摸操作,从元素origin_el滚动至元素destination_el
driver.drag_and_drop(el1,el2) #将元素origin_el拖到目标元素destination_el
driver.tap([(x,y),(x1,y1)],500) #
driver.tap([(100, 20), (100, 60), (100, 100)], 500) 模拟手指点击(最多五个手指),可设置按住时间长度(毫秒)
driver.tap(int fingers, WebElement element,
int duration) #点击element控件中心点按下,duration*5毫秒秒后松开,如此重复fingers次。
driver.tap(int fingers, int x, int y, int
duration) #点击(x,y)点按下,duration*5毫秒后松开,如此重复fingers次。
driver.pinch(element=None, percent=200,
steps=50) #在元素上执行模拟双指捏(缩小操作)
driver.zoom(element=None, percent=200,
steps=50): #在元素上执行放大操作,双指放大,和pinch相反的操作。
driver.swipe(x1,y1,x2,y2, duration =500) #从(start_x,start_y)滑到(end_x,end_y),分duration步滑,每一步用时是5毫秒。
driver.flick(x1,y1,x2,y2) #按住A点后快速滑动至B点
driver.shake()#摇一摇手机
drvier.lock(seconds):#锁屏一段时间,iOS专有
driver.keyevent(keycode, metastate=None): #发送按键码(安卓仅有),按键码可以上网址中找到
driver.press_keycode(self, keycode,
metastate=None):#发送按键码(安卓仅有),按键码可以上网址中找到
driver.long_press_keycode(self, keycode,
metastate=None): #发送一个长按的按键码(长按某键)
输入法
driver.hide_keyboard(key_name=None,
key=None, strategy=None):#隐藏键盘,iOS使用key_name隐藏,安卓不使用参数
driver.available_ime_engines(): #返回安卓设备可用的输入法
driver.is_ime_active(): #安卓用法,检查设备是否有输入法服务活动,返回真/假。
driver.activate_ime_engine(engine):#激活安卓设备中的指定输入法,设备可用输入法可以从“available_ime_engines”获取
driver.deactivate_ime_engine(): #关闭安卓设备当前的输入法
driver.active_ime_engine(): #返回当前输入法的包名
app控制
driver.reset() #重置应用(相当于卸载重装应用)
driver.background_app(seconds) #把当前应用放到后台运行seconds秒
driver.open_notifications() #打开通知栏,只有Android可用(仅支持API 18 以上的安卓系统)
driver.is_app_installed(“com.xxxx”) #检查app是否有安装,返回 True or
False
driver.install_app(app_path) #安装app,app_path为安装包路径
driver.remove_app(“com.xxx.”) #删除app
driver.launch_app() #启动app
driver.close_app() #关闭app,其实就是按home键把应用置于后台
driver.reset_app() #先closeApp然后在launchAPP
driver.close() #关闭当前窗口
driver.quit() #退出脚本运行并关闭每个相关的窗口连接
contexts/activity
driver.contexts #返回会话中的所有上下文,使用后可以识别H5页面的控件
driver. current_context#返回当前会话上下文
driver.Context #返回当前会话的当前上下文。
driver.current_activity()#获取当前的activity
driver.switch_to.context(None) #将上下文切换到默认上
driver.wait_activity(activity, timeout,
interval=1): #等待指定的activity出现直到超时,interval为扫描间隔1秒,
即每隔几秒获取一次当前的activity。返回的True 或 False
driver.start_activity(app_package,
app_activity, **opts): #在测试过程中打开任意活动。如果活动属于另一个应用程序,该程序的启动和活动被打开。这是一个安卓的方法
获取信息类API
driver.get_app_string() #获取默认系统语言对应的Strings.xml文件内的数据。
driver.get_app_string(String language) #查找某一个语言环境对应的字符串文件Strings.xml内数据。
driver.current_activity() #获取当前activity,比如(.ApiDemos)
driver.app_strings #应用的字符串
network
driver.network_connection#返回网络类型数值
driver.get_network_connection() 得到当前网络的状态
driver.set_network_connection(ConnectionType.WIFI_ONLY)
#设置网络的状态。先加载from appium.webdriver.connectiontype import ConnectionType
位置服务
driver.toggle_location_services()#打开安卓设备上的位置定位设置
driver.set_location(latitude, longitude,
altitude): #设置设备的纬度,经度,高度
- latitude纬度 - String
or numeric value between -90.0 and 90.00
- longitude经度 - String
or numeric value between -180.0 and 180.0
- altitude海拔高度- String
or numeric value
文件pull/push
driver.pull_file('Library/AddressBook/AddressBook.sqlitedb')
#从设备的指定路径获取文件(将设备上的文件pull到本地硬盘上)
driver.pull_folder(path) #将设备上的文件夹pull到本地硬盘上,一般远程文件为/data/local/tmp下的文件。
driver.push_file(path,
data.encode('base64')) #将字符数组用64位格式写到远程目录的某个文件中。即把本地文件push到设备上。data = "some data for the file" path =
"/data/local/tmp/file.txt"
2、元素定位
1可定位元素:
Appium 定位方式是依赖于 Selenium 的。所以 Selenium 的定位方式Appium 都支持,除此之外还有Android 和 iOS 原生的定位方式,所以共有十多种定位方式。目前Appium 官方的定位方式中已经废除了name定位方式,另外tagName、linkText 、partialLinkText一般是在 web 页面使用,移动端很少用:
name # 元素的name属性,目前官方在移动端去掉这个定位方式,使用AccessibilityId替代
tagName # 元素的标签名
partialLinkText # 链接元素的部分显示文字
linkText # 链接元素的全部显示文字
cssSelector
# Selenium 最强大的定位方法,比xpath速度快,但比xpath难上手
className # 元素的 class 属性
id # 元素的 id 属性
xpath # 比 css 定位方式稍弱一些的定位方法,但胜在容易上手,比较好使用,缺点就是速度慢一些。
AccessibilityId #
Appium 中用于替代 name 定位方式
AndroidUIAutomator # Android 测试,最强大速度最快的定位方式
iOSNsPredicateString # iOS 谓词的定位方式,仅支持
XCTest 框架,需大于 iOS 9.3或以上
IosUIAutomation # iOS 谓词的定位方式,仅支持
UIAutomation 框架,需大于iOS 9.3或以下
iOSClassChain # 类似xpath的定位方式,仅支持XCTest框架,不如xpath和iOSNsPredicateString好
2定位方法:
常用的8种定位方法(与selenium通用)
driver.find_element_by_name() # name定位
driver.find_element_by_tag_name() # tag定位
driver.find_element_by_partial_link_text() # partial_link定位
driver.find_element_by_link_text() # link定位
driver.find_element_by_css_selector() # css 定位
driver.find_element_by_class_name() # class_name定位
driver.find_element_by_id() # id定位
driver.find_element_by_xpath() # xpath定位
移动端3种新增方法
driver.find_element_by_accessibility_id() #
accessibility_id 定位
driver.find_element_by_android_uiautomator() #
Android
driver.find_element_by_ios_uiautomation() #
ios
通过id定位
仅支持 Android 4.2或以上,推荐使用,使用
id 能准确定位就使用id,id定位信息简洁不容易错误。
# resrouce-id属性使用id定位:
driver.find_element_by_id('username')
driver.find_element_by_id("com.wuba.zhuanzhuan:id/azo")
也可以直接用id后面的内容driver.find_element_by_id("azo")
通过class_name定位
# class属性使用class_name定位:(一般一个页面上的class属性不唯一,元素不唯一的话定位会报错了)Android 和 iOS,推荐使用。
self.driver.find_element_by_class_name('android.view.View').click()
driver.find_element_by_class_name("android.widget.RelativeLayout")
通过xpath定位
支持Android 和 iOS。但由于iOS 10开始使用的
XCUITest 框架所以不支持;定位速度很慢,所以官方现在不推荐大家使用。
driver.find_element_by_xpath("//android.widget.LinearLayout[1]/android.widget.XXX")
#使用绝对路径定位
driver.find_element_by_xpath("//className")
#使用相对路径定位
driver.find_element_by_xpath("//className[index]")
#通过元素的索引定位
driver.find_element_by_xpath("//className[@label='更多信息']")
#通过元素的属性定位,使用一种属性定位
driver.find_element_by_xpath("//className[@label='更多信息'][@isVisible='1']")
#通过元素的属性定位,使用两种属性定位
driver.find_element_by_xpath("//className[contains(@label,'更多')]")
#通过元素的属性定位,使用部分属性定位(最强大)
#Xpath定位
self.driver.find_element_by_xpath("//android.widget.TextView[@text='
']").click()
AccessibilityId
替代以前的name定位方式,推荐使用。在
Android 上主要使用元素的content-desc属性进行定位。在 iOS 上,主要使用元素的label或name(两个属性的值都一样)属性进行定位,
#content-desc属性使用accessibility_id定位
driver.find_element_by_accessibility_id(u"我的").click()
driver.find_element_by_accessibility_id()
android_uiautomator 定位
仅支持 Android 4.2或以上,可支持元素的单个属性和多个属性定位,推荐使用。元素的所有属性都可用android_uiautomator做定位,功能非常强大,且速度很快。
支持元素以下属性定位:index(int index)、text(String text)、resourceId(String id)、className(String className)、packageName(String
packageName)、description(String desc)、checked(boolean val)、clickable(boolean
val)、enabled(boolean val)、longClickable(boolean val)、password(boolean
val)、selected(boolean val)、instance(int val)
driver.find_element_by_android_uiautomator('new
UiSelector().resourceId("username")').clear()
driver.find_element_by_android_uiautomator("new
UiSelector().text(\"发送\")") # 使用一种属性定位
driver.find_element_by_android_uiautomator
("new UiSelector().text(\"发送\").clickable(true)")
# 使用两种属性定位
通过text属性通过android_uiautomator定位的结果是个list,不能直接click。所以如果要点击需要取数组的值,比如下面是点击找到的第一个元素
driver.find_elements_by_android_uiautomator("new UiSelector().text(\"+关注\")")[0].click()
通过css_selector定位(webview)
只适用于webview的html页面,继承自webdriver,与pc版本的UI测试一致
driver.find_element_by_css_selector()
通过link_text定位(webview)
只适用于webview容器中的html页面,继承自webdriver,与pc版本的UI测试一致
driver.find_element_by_link_text()
通过name定位
只适用于web view容器中的html页面
driver.find_element_by_name()
# text属性可以使用name定位
driver.find_element_by_name(u'请输入用户名')
通过元素定位元素
可以先找到某个元素,然后再进一步定位元素
find_element_by_class_xpath(“xxx”).find_element_by_name(“yyy")
3、元素的方法
from appium.webdriver import webelement
element.tag_name() #返回元素的tagName属性,经实践返回的是class
name
element.text #返回元素的文本值,注意:没有括号
element.click() #点击元素
element.submit() #提交表单
element.clear() #清除输入的内容
element.get_attribute(name) #获取 content-desc,但还不能保证返回的一定是
content-desc可获取的字符串类型:name(返回 content-desc 或 text)、text(返回 text)、className(返回 class,只有 API=>18 才能支持)、resourceId(返回 resource-id,只有 API=>18 才能支持)
可获取的布尔类型(如果无特殊说明, get_attribute 里面使用的属性名称和 uiautomatorviewer 里面的一致):enabled、checkable、checked、clickable、focusable、 focused、longClickable(返回 long-clickable)、scrollable、selected
element.is_slected() #返回元素是否选择。可以用来检查一个复选框或单选按钮被选中。
element.is_enabled() #返回元素是否可用True of False
element.send_keys(*value) #在元素中模拟输入(开启appium自带的输入法并配置了appium输入法后,可以输入中英文)
element.size() #获取元素的大小(高和宽)
element.location() #获取元素左上角的坐标
element.location.get('x') #返回element的x坐标, int类型
element.location.get('y') #返回element的y坐标, int类型
element.rect() #元素的大小和位置的字典
Appium python自动化测试系列之元素的定位(六)
Appium python自动化测试系列之Android UIAutomator终极定位(七)
Appium python自动化测试系列之滑动函数封装实战(八)
Appium python自动化测试系列之等待函数如何进行实战(九)
Appium python自动化测试系列之页面滑动原理讲解(十)
appium desktop的更多相关文章
- appium desktop 版本发布
Appium Desktop is an open source app for Mac, Windows, and Linux which gives you the power of the Ap ...
- Appium Desktop 介绍及使用
一.AppiumDesktop介绍 1.Appium-server的图形界面.可以设置选项.启动/停止服务器.查看日志等功能:且无须提前安装Node / NPM,因为Node运行时直接与Appium ...
- Appium Desktop Inspector 安卓真机配置(Windows)
本文是基于 Windows环境 通过Appium Desktop 测试真机,首先要确保测试机已经和电脑正确连接(将手机和电脑通过USB数据线连接,手机打开USB调试) 确认电脑与手机是否连接成功的方法 ...
- Appium Desktop介绍-xcodebuild failed with code 65 问题解决
Appium Desktop介绍-xcodebuild failed with code 65 问题解决 一.Appium Desktop介绍 Appium Desktop是一款用于Mac.Wind ...
- Appium与Appium Desktop的区别
Appium-Server的配置,在之前的博文已有介绍,基于Python的Appium环境搭建合集,所以在此处就不详细介绍了.今天主要来分享下Appium-Server和Appium desktop在 ...
- [原创]Appium与Appium desktop的区别
1.两者都属于Appium 服务端 2.二者最新版本如下:地址:https://github.com/appium/appium-desktop/releases Appium 服务端支持的:地址:h ...
- Appium Desktop 元素定位和脚本录制功能
Appium Desktop除了可以做Server之外还可以进行元素定位和脚本录制功能,点击放大镜按钮,进入页面设置.开始配置Desired Capabilities. 配置Desired Capab ...
- appium desktop 定位弹出框时报错
今天在定位真机APP的时候,弹出框的内容死活定位不到,只能定位到背景的内容. 问题:appium desktop 定位弹出框时报错,定位不到,只能定位到背景的内容. 分析: 定位工具找不到弹出框的元素 ...
- 5、通过Appium Desktop实现页面元素定位
之前我们已经安装了Appium Desktop,下面就让我们使用Appium Desktop实现页面元素定位 1.首先我们打开Appium Desktop,进入如下界面,点击Start Server ...
- 1、Appium Desktop介绍
Appium Desktop是一款适用于Mac,Windows和Linux的开源应用程序,它以美观而灵活的用户界面为您提供Appium自动化服务器的强大功能.它是几个Appium相关工具的组合: Ap ...
随机推荐
- fedora安装gcc
查看gcc版本 gcc --version 命令行编译 g++ -std=c++11 -o main main.cpp 查看程序是否编译成功 echo $? 返回0表示编译成功 新版的Fedora(2 ...
- 使用Intellij IDEA的Bookmarks
用idea的时候,无意中发现了了一个小功能,叫做BookMark Ctrl+F11按出来的然后去查阅了一下文档,主要功能也就是可以清晰的看到自己标的书签附近的代码,比如我们在第11行按一下F11插入一 ...
- CAD参数绘制样条线(网页版)
在CAD设计时,需要绘制样条线,用户可以设置样条线线重及颜色等属性. 主要用到函数说明: _DMxDrawX::PathLineTo 把路径下一个点移到指定位置.详细说明如下: 参数 说明 DOUBL ...
- Analysis Of The Causes Of Internal Symmetry Of Hydraulic Motor
The main reasons why hydraulic motors have this symmetrical internal structure are as follows: The ...
- 无法完成安装:'Cannot access storage file '/
今天自己编译了spice-protocol spice-gtk spice qemu,然后想用virsh去创建一个虚机: # virsh define demo.xml 定义域 demo(从 ...
- linux中查看文件指定行的数据
http://jingyan.baidu.com/article/15622f24125872fdfdbea560.html
- vue中axios发送post请求,后端(@RequestParam)接不到参数
遇到的问题描述 :axios post 请求,后端接收不到参数. 我们的接口是java,用@RequestParam来接收前端的参数 解决方案:使用qs:axios中已经包含有qs,所以无需重新安装, ...
- 零基础入门学习Python(12)--列表:一个打了激素的数组(3)
前言 这节课我们继续谈一下Python列表一些知识 知识点 Python常用操作符 比较操作符 >>> list1 = [123] >>> list2 = [234 ...
- Samba 学习笔记
这个网站不错.https://www.ibm.com/developerworks/cn/linux/l-lpic3-311-1/
- 转:Centos7安装zabbix3.4超详细步骤解析
安装前准备: 1.1 安装依赖包: yum -y install wget net-snmp-devel OpenIPMI-devel httpd openssl-devel java lrzsz f ...