官方:https://github.com/appium/python-client
https://pypi.org/project/Appium-Python-Client/
https://www.androiddevtools.cn/
http://appium.io/
首先确保appium环境及依赖安装好
由于Appium Desktop出来了,所以使用appium要比以前简单许多
1、启动Appium Desktop
2、启动成功后如图,点击inspector
选择上边第一个菜单,点击这里,输入手机配置
好了我们在Desired Capabilities添加以下字段,注意:
左侧写key(名字固定写法不要改),右侧写value(填错会报错启动不起来)
{
"platformName": "Android",
"deviceName": "df4f404",
"platformVersion": "9",
# 美团包信息
"appPackage": "com.sankuai.meituan",
"appActivity": "com.meituan.android.pt.homepage.activity.MainActivity",
# 知乎包信息
#"appPackage": "com.zhihu.android",
# "appActivity": ".app.ui.activity.MainActivity",
}
3、查看设备是否链接成功
在终端输入 :adb devices,检查设备是否还是连接状态
4、成功启动后如图
app应用的元素使用的是控件定位,不同于web网页,web网页定位元素通常使用的是F12工具,那么在app当中我们则要借助其它的工具来辅助定位。
uiautomatorviewer.bat工具在安装完ADT工具之后,位于ADT安装路径的android-sdk-windows\tools目录下
双击启动即可,启动之后,在初始界面上,点击如图位置按钮可以进行截屏
截屏后即可查看各个元素,截屏后的效果:
在appium启动后的日志窗口界面,点击“启动检查器会话”,会跳转到检查器启动参数配置界面,参数配置直接将我们代码里面的启动参数搬过来就可以了。
点击启动后,会根据我们配置的应用信息,自动跳转到应用的主页面,我们就可以开始进行元素定位了:
appium从selenium中继承了所有的元素定位方法,并且增加了自己的一些方法,我们先看看appium的源码:
但是从继承selenium中的定位方法中,一般只会用到id、class_name、xpath这三种方法,总结起来,appium中常用的定位方法一般有以下五种:
- 通过id定位:resource-id
- 通过class_name定位:class
- 通过accessibility_id定位:content-desc
- 通过android_uiautomator定位:SDK自带的java开发的uiautomator自动化框架
- 通过xpath定位
UIAutomator介绍:UIAutomator是安卓移动端的UI自动化框架,要求:Android4.3以上
UIAutomator框架的主要特点:
id定位
driver.find_element_by_id() 或者 MobileBy.ID
注意这里是使用resource-id,而不是id
loc = (MobileBy.ID, 'com.taobao.taobao:id/iv_image')
class_name定位
driver.find_element_by_class_name() 或者 MobileBy.CLASS_NAME
直接使用class即可
loc = (MobileBy.CLASS_NAME, 'android.widget.ImageView')
accessibility_id定位
driver.find_element_by_accessibility_id() 或者 MobileBy.ACCESSIBILITY_ID
这里使用content-desc即可
loc = (MobileBy.ACCESSIBILITY_ID, '管理')
android_uiautomator定位
driver.find_element_by_android_uiautomator() 或者 MobileBy.ANDROID_UIAUTOMATOR
该方法的参数为UiSelector类定位元素的表达式:
new UiSelector().函数名称('定位表达式')
实例化一个UiSelector对象,然后通过实例接口调用,具体用到的一些方法参考官网的说明,网址:
这里调用UiSelector对象的text()方法即可,更多的方法请参考上述地址
# 注意字符串必须要用双引号
loc = (MobileBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("去逛逛")')
xpath定位
driver.find_element_by_xpath() 或者 MobileBy.XPATH
注意这里的标签名一定是使用class来作为xpath的标签名,在这里不同于selenium,并且遇到text文本定位的时候,使用的是text而不是text()
loc = (MobileBy.XPATH, '//android.widget.TextView[text="首页"]')
1.如果元素text是唯一的,可以通过text文本定位
//*[@text=’text文本属性’]
# 定位text
driver.find_element_by_xpath("//*[@text='扫一扫']").click()
2.如果元素id是唯一的,也可以id属性定位
//*[@resource-id=’id属性’]
# 定位 resource-id
driver.find_element_by_xpath("//*[@resource-id='com.taobao.taobao:id/tv_scan_text']").click()
同样可以联合上面两种方式定位,如下
# 也可以联合@resource-id属性和@text文本属性来下定位
driver.find_element_by_xpth("//*[@resource-id='com.taobao.taobao:id/tv_scan_text'][@text='扫一扫']").click()
3.class属性唯一的话,同样可以通过class属性定位,有两种方法
第一种://class属性
# 定位搜索框 //class属性
driver.find_element_by_xpath("//android.widget.EditText").click()
第二种: //*[@class=’class属性’]
# 定位搜索框 //*[@class='class属性']
driver.find_element_by_xpath("//*[@class='android.widget.EditText']").click()
4.通过content-desc属性定位
//*[@content-desc=’desc的文本’]
#点登录/注册
driver.find_element_by_xpath("//*[@text='注册/登录']").click()
time.sleep(3)
#content-desc定位
driver.find_element_by_xpath("//*[@content-desc='帮助']").click()
1)contains是模糊匹配的定位方法,对于一个元素的id或者text不是固定的,但有一部分是固定的,这种就可以模糊匹配。
//*[contains(@content-desc, '帮助')]
# contains匹配text
driver.find_element_by_xpath('//*[contains(@text, "注册/登录")]').click()
time.sleep(3)
# contains匹配textcontent-desc
driver.find_element_by_xpath("//*[contains(@content-desc, '帮助')]").click()
2)contains也能模糊匹配id和class属性
//*[contains(@resource-id, 'id属性')]
//*[contains(@clsss, ‘class属性’)]
#定位搜索框class
driver.find_element_by_xpath("//*[contains(@class, 'EditText')]").click()
time.sleep(3)
driver.back()
#定位id
driver.find_element_by_xpath("//*[contains(@resource-id, 'id/home_searchedit')]").click()
使用的是UIAumtomator下的方法,因为UiSelector类下的方法都反回了对象本身,因此可以连续调用各种方法,这种使用方法即组合定位
我们可以连续调用三个方法进行组合
loc = (MobileBy.ANDROID_UIAUTOMATOR, 'new UiSelector().className("android.widget.TextView").text("家装").index(2)')
如果一个元素有2个属性,通过xpath也可以同时匹配2个属性,text, resource-id,class ,index,content-desc这些属性都能任意组合定位
# id和class属性 定位搜索框
id_class = '//android.widget.EditText[@resource-id="com.taobao.taobao:id/home_searchedit"]'
driver.find_element_by_xpath(id_class).click()
time.sleep(3)
driver.back()
# text和index属性 定位登录/注册
desc_class = '//*[@text="注册/登录" and @index="1"]'
driver.find_element_by_xpath(desc_class).click()
time.sleep(3)
# class和text属性 定位输入手机号
class_text = '//android.widget.EditText[@text="请输入手机号码"]'
driver.find_element_by_xpath(class_text).send_keys("512200893")
time.sleep(3)
# class和desc 定位帮助
id_desc = '//*[contains(@resource-id, "aliuser_menu_item_help") and @content-desc="帮助"]'
driver.find_element_by_xpath(id_desc).click()
调用UiSelector类的childSelector()方法,在该方法里面传入子代的元素定位表达式
比如刚刚“家装”的父节点属性如下
那么我们的定位表达式可以通过父子定位来实现
loc = (MobileBy.ANDROID_UIAUTOMATOR, 'new UiSelector().className("android.widget.LinearLayout").childSelector(text("家装"))')
通过儿子定位父亲
# 通过子元素定位父元素
# 方法一: ..
sun_fa1 = '//*[@resource-id="com.taobao.taobao:id/tv_scan_text"]/..'
c = driver.find_element_by_xpath(sun_fa1).tag_name
print(c)
# 方法二 parent::*
sun_fa2 = '//*[@resource-id="com.taobao.taobao:id/tv_scan_text"]/parent::*'
d = driver.find_element_by_xpath(sun_fa1).tag_name
print(d)
# 方法三 parent::android.widget.LinearLayout
sun_fa3 = '//*[@resource-id="com.taobao.taobao:id/tv_scan_text"]/parent::android.widget.LinearLayout'
e = driver.find_element_by_xpath(sun_fa1).tag_name
print(e)
同理,我们调用fromParent()方法,表示定位同级的兄弟元素
已知了“首页”按钮为本元素,text属性为“首页”,则通过该元素来定位“百货元素”
loc = (MobileBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("首页").fromParent(text("百货"))')
运行一个demo需要如下三个主要部分:android模拟器已经启动;appium服务已经开启,以及python相关的环境准备好了
pip install Appium-Python-Client
# pip install pytest
# -*- coding:utf-8 -*-
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
desired_caps = {
'platformName':'Android',
'platformVersion':'4.4.2',
'deviceName':'127.0.0.1:62001',#127.0.0.1:62001 Android Emulator
'appPackage':'barinov.calculator_free', # com.youdao.calculator com.android.calculator2
'appActivity':'.view.calculator.CalculatorActivity',# .activities.MainActivity .Calculator
}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)#localhost
#通过名称查找
btn = driver.find_element_by_name("+")
#通过ID查找
start_btn =driver.find_element_by_id('com.cn21.ecloud:id/instruction_close_btn')
#通过类名查找
child_text =driver.find_element_by_class_name('android.widget.TextView')
#通过android_uiautomator查找
start_btn =driver.find_element_by_android_uiautomator('new UiSelector().clickable(true)')
driver.find_element_by_android_uiautomator('new UiSelector().description("Animation")')
# 利用 Xpath定位
driver.find_element_by_xpath(xpath)
'''
以上find_element_by_XX 都是返回符合条件的第一个控件,如果要返回多个控件,可以调用 find_elements_by_XX, 返回的是一个list。
注意:如果找不到符合条件的控件,会抛出异常。
'''
#模拟按钮点击
start_btn.click()#注意:有的点击如果需要等待动画、或者网络请求,建议等待一会
#输入框输入文本
start_btn.send_keys('123456')#注意:Android如果要正确输入,需要把使用系统自带的输入法,第三方输入法无法正确输入。
#模拟点击返回键
driver.press_keycode(4)#其中按钮的定义,由Android里的KeyEvent.java里定义的,所以其它的Android按钮也是支持的。
#关闭driver
driver.quit()
'''
注意:一定要记得关闭driver, 否则下次连接的时候可能会出异常,因为Appium以为你上次未关闭,会创建Session失败。
为了避免代码出现异常而没有关闭,可以在捕获异常时再关闭。
'''
#--------------------------------------------------------------------------------------------------
#滑动界面
#演示点击屏幕中间,并向上拉动(相当于查看列表下面的内容了)
from appium.webdriver.common.touch_action import TouchAction
def test_scroll_down(driver):
screen = driver.get_window_size()
action = TouchAction(driver)
action.press(x=screen['width']/2,y=screen['height']/2)
action.move_to(x=0,y=-screen['height']/10)
action.release()
action.perform()
#--------------------------------------------------------------------------------------------------
#打印上下文
driver.contexts
#打印当前上下文
driver.context
driver.current_context
#切换上下文
driver.switch_to.context('WEBVIEW')
#打印页面元素
driver.page_source
#获取元素text属性
driver.find_element().get_attribute('text') #Android使用(获取元素的text值)
driver.find_element().text #iOS使用(获取元素的value值)
#定位
uia_string='newUiSelector().text("竞彩篮球")'
driver.find_element_by_ios_uiautomation(uia_string)
driver.find_elements_by_ios_uiautomation(uia_string)
driver.find_element_by_android_uiautomator(uia_string)
driver.find_elements_by_android_uiautomator(uia_string)
driver.find_element_by_accessibility_id(id)#(此方法使用的是元素的content-des属性)
driver.find_elements_by_accessibility_id(id)
driver.find_element_by_id(id)
driver.find_elements_by_id(id)#(获取的为元素集合使用*[Num]获取子元素)
#因为webdriver没有xpath全部的库所有只支持两种格式
driver.find_element_by_xpath("//android.widget.EditText[@content-desc='请输入登录密码']")
driver.find_element_by_xpath("//android.widget.ListView/android.widget.EditText")
driver.find_elements_by_xpath('xpath')
driver.find_element_by_name('name')
driver.find_elements_by_name('name')
driver.find_element_by_class_name('class')
driver.find_elements_by_class_name('class')
from selenium.webdriver.common.by import By
driver.find_element(by=By.ID,value=None)
#坐标点击
x=y=x1=x2=y1=y2=time=0
driver.tap([(x,y)],time)
#滑动
driver.swipe(x1,y1,x2,y2,time)
driver.flick(x1,y1,x2,y2)
#输入
driver.send_keys()
driver.set_text()# Android可用
driver.set_value()# iOS可用
'''
如果使用sendkeys不行,可以尝试下面两种方法,我在测试ios输入密码框是自定义的键盘时,用sendkeys输入不了,
appium服务端log提示没找到keyboard,后面尝试setvalue可以输入。
'''
#截图
driver.get_screenshot_as_file('filename')
#获取手机屏幕分辨率
driver.get_window_size()
x =driver.get_window_size()['width']
y = driver.get_window_size()['height']
#设置屏幕分辨率
driver.set_window_size('width','height')
#获取当前坐标位置
driver.get_window_position()
#滚动
driver.scroll('ele1','ele2')
#按住element并拖动到另外一个element上
driver.drag_and_drop('ele1','ele2')
#缩小
driver.pinch('ele')
#放大
driver.zoom('ele')
#重启app
driver.reset()
#隐藏键盘
driver.hide_keyboard()
keycode=path=''
#发送键盘事件
driver.keyevent(keycode)
#按住键盘
driver.press_keycode(keycode)
#长按住键盘
driver.long_press_keycode(keycode)
#上传文件
driver.push_file(path)
#下载文件
driver.pull_file(path)
#下载文件夹
driver.pull_folder(path)
#app隐藏后台
driver.background_app(time)
#安装app
driver.install_app(path)
#卸载app
driver.remove_app(app_id)
#启动app
driver.launch_app()
#关闭app
driver.close_app()
#检查应用是否已经安装
driver.is_app_installed('com.example.android.apis')
#启动activity
driver.start_activity('app_package','app_activity')
#打印当前activity
driver.current_activity
#锁屏
driver.lock(time)
# 振动,模拟设备摇晃
driver.shake()
#打开通知栏(api 18以上)
driver.open_notifications()
#获取网络
driver.network_connection
#设置网络连接( android only.)
driver.set_network_connection(type)
'''
Value (Alias) |Data | Wifi | Airplane Mode
0 (None) | 0 | 0 | 0
1 (Airplane Mode) | 0 | 0 | 1
2 (Wifi only) | 0 | 1 | 0
4 (Data only) | 1 | 0 | 0
6 (All network on) | 1 | 1 | 0
type参数:
NO_CONNECTION =0
AIRPLANE_MODE = 1
WIFI_ONLY = 2
DATA_ONLY = 4
ALL_NETWORK_ON = 6
'''
from appium.webdriver.connectiontype import ConnectionType
driver.set_network_connection(ConnectionType.AIRPLANE_MODE)
#获取手机输入法(返回list)
driver.available_ime_engines
#激活某种输入法
driver.activate_ime_engine('engine')
#判断输入法是否激活(返回bool)
driver.is_ime_active()
#撤销当前输入法(Android only)
driver.deactivate_ime_engine()
#得到当前设置
driver.get_settings()
#更新当前设置
driver.update_settings('settings')
'''
settings参数为dict,如{ignoreUnimportantViews: True}
ignoreUnimportantViews参数:调用 uiautomator的函数setCompressedLayoutHierarchy()。
由于 Accessibility命令在忽略部分元素的情况下执行速度会加快,这个关键字能加快测试执行的速度。
被忽略的元素将不能够被找到,因此这个关键字同时也被实现成可以随时改变的 *设置 (settings ) *。默认值 false
'''
#开关定位服务
driver.toggle_location_services()
# 设置经纬度 用法
driver.set_location(纬度,经度,高度)
# 元素是否可选择
driver.is_selected()
from appium.webdriver.extensions.android.nativekey import AndroidKey
# 输入回车键
driver.press_keycode(AndroidKey.ENTER)
# 隐式等待
driver.implicitly_wait(5)
#coding=utf-8
from appium import webdriver
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.0.1'
desired_caps['deviceName'] = 'Android Emulator'
desired_caps['appPackage'] = 'com.android.calculator2'
desired_caps['appActivity'] = '.Calculator'
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
driver.find_element_by_name("1").click()
driver.find_element_by_name("5").click()
driver.find_element_by_name("9").click()
driver.find_element_by_name("delete").click()
driver.find_element_by_name("9").click()
driver.find_element_by_name("5").click()
driver.find_element_by_name("+").click()
driver.find_element_by_name("6").click()
driver.find_element_by_name("=").click()
driver.quit()
# coding:utf-8
import time,os
from appium import webdriver #pip3 install Appium-Python-Client
from selenium.webdriver.support.ui import WebDriverWait
PATH = lambda p: os.path.abspath(os.path.join(os.path.dirname(__file__), p))
# 初始化
desired_caps = {}
# 使用哪种移动平台
desired_caps['platformName'] = 'Android'
# Android版本
desired_caps['platformVersion'] = '6.0.1'
# 启动哪种设备,是真机还是模拟器?
desired_caps['deviceName'] = 'Galaxy S6 edge'
# App的绝对路径, 如果不是从安装开始,则不是必填项,可以由下面appPackage,appActivity的两句直接启动
desired_caps['app'] = PATH('D:\kuyu.apk')
desired_caps['appPackage'] = 'com.baidu.searchbox'#如何获取下面讲解
desired_caps['appActivity'] = 'MainActivity'
# 使用unicodeKeyboard的编码方式来发送字符串
desired_caps['unicodeKeyboard'] = True
# 将键盘给隐藏起来 ,运行完成后重置软键盘的状态
desired_caps['resetKeyboard'] = True
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) # 初始化
WebDriverWait(driver, 20).until(lambda the_driver: the_driver.find_element_by_id("com.kuyu:id/tv_login").is_displayed())
driver.find_element_by_id("com.kuyu:id/tv_login").click()
# 输入用户名
driver.find_element_by_id("com.kuyu:id/et_email").send_keys("******")
# 输入密码
driver.find_element_by_id("com.kuyu:id/et_pwd").send_keys("******")
# 点击登录
driver.find_element_by_id("com.kuyu:id/tv_login").click()
# 这里加了一个等待,判断指定的元素出现则为登录成功(等待方法不懂没有关系,以后会再讲解如何设置等待)
WebDriverWait(driver, 20).until(
lambda the_driver: the_driver.find_element_by_id("com.kuyu:id/include_study_iv_add").is_displayed())
print(u"登录成功")
driver.quit()
"""
1.学习目标
必须掌握APP中webview页面的操作方法
2.操作步骤
2.1 webview页面概念----H5页面
2.2 识别webview页面
借助元素定位工具,如果无法获取页面局部元素,只能定位整个页面,
该页面他的class属性值=android.webkit.webview,则该页面是webview页面
2.3 操作webview页面---相当于selenium中iframe操作步骤
1.获取到webview页面的context
获取所有contexts包括原生页面和webview
driver.contexts
获取当前context
driver.current_context
2.进入webview
driver.swith_to.context(具体webview页面的context值)
3.操作webview页面中的元素
操作方法和selenium中操作web页面是一致的
借助chrome://inspect(需要梯子)
操作过程中,注意chromedriver和手机本身浏览器内核版本匹配
4.退出webview 等同于进入native
回到原生页面
driver.switch_to("NATIVE-APP")
3.需求
在百度appl操作webview页面:微博登录页面
"""
# 1.导入appium和TouchAction
import time
from appium import webdriver
# 2.创建Desired capabilities对象,添加启动参数
desired_caps = {
"platformName": "Android", # 系统名称
"platformVersion": "5.1.1", # 系统版本
"deviceName": "127.0.0.1:21503", # 设备名称
"appPackage": "com.baidu.searchbox", # APP包名
"appActivity": ".MainActivity" # APP启动名
}
# 3.启动APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
# 4.操作APP
# 4.1 点击未登录
driver.wait_activity(".MainActivity", 10)
driver.find_element_by_android_uiautomator('new UiSelector().text("未登录")').click()
# 4.2 点击微博登录按钮
driver.wait_activity(".MainActivity", 10)
driver.find_element_by_accessibility_id("微博登录").click()
# 4.3 获取页面所有的context
# 指native(原生)页面和webview页面
driver.wait_activity("com.sina.weibo.sdk.web.WeiboSdkWebActivity", 15)
contexts = driver.contexts
# 输出结果:['NATIVE_APP', 'WEBVIEW_com.baidu.searchbox']
# 'NATIVE_APP' : 代表原生页面
# 'WEBVIEW_com.baidu.searchbox' : 代表webview页面
print(contexts)
# 4.3 进入webview中
driver.switch_to.context(contexts[1])
# 查看当前页面的context
print(driver.current_context)
time.sleep(5)
# 4.4 操作webview页面元素
# 定位微博登录页面的邮箱/手机输入框。并输入内容
# 操作方法和selenium中操作web页面是一致的
username = driver.find_element_by_id("loginName")
# 如果需要输入中文,需要在Desired capabilities对象中添加两个配置项
# "unicodeKeyboard": True,
# "resetKeyboard": True
username.send_keys("123456")
# 这里有几点需要注意:
# 1.在webview页面定位元素需要借助chrome://inspect工具
# 在chrome://inspect中找打当前打开的webview页面(具体操作可以看之前的文章)
# 注意:chrome://inspect的使用需要梯子。
# 2.注意chromedriver和手机本身浏览器内核版本匹配
# 否则定位不到元素,还会报错,如下:
# WebDriverException : Original error: No Chromedriver found that can automate Chrome '39.0.0'.
# 意思是WebDriver的操作:未找到可自动执行Chrome '39.0.0' 版本的Chromedriver驱动
# 说明一下:在webview中的操作和selenium中的操作是一致的
# 所需webview中操作的执行也是需要Google浏览器的驱动。
# 在Android手机中,浏览器的内核都是Google的,
# Google浏览器的内核版本是多少,报错中已经给出提示。
# 如上报错信息中提示的是'39.0.0' 版本,
# 我们就需要找一个'39.0.0' 版本对应的的Chromedriver驱动
# (下载一个2.13版本的Chromedriver驱动就可以对应'39.0.0' 版本的Google浏览器)
# 然后把该Chromedriver驱动放入Appium的安装目录中,具体位置如下:
# C:\Users\L\AppData\Local\Programs\Appium\resources\app\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win
# 把之前的删除掉,或者备份一下。
# 4.5 退出webview 进入native(原生页面)
driver.switch_to.context(contexts[0])
# 查看当前页面的context
print(driver.current_context)
time.sleep(3)
# 点击关闭微博登陆页面
driver.find_element_by_android_uiautomator('new UiSelector().text("关闭")').click()
# 5.关闭APP
time.sleep(3)
driver.quit()
"""
1.学习目标
掌握appium获取元素坐标
2.操作步骤
元素.location 获取元素坐标
app页面坐标分部:
坐标原点-屏幕左上角(0,0)
从左向右 x坐标,逐渐增大
从上向下 Y坐标,逐渐增大
3.需求
在设置APP中实现蓝牙定位
"""
# 1.导入appium
import time
from appium import webdriver
# 2.创建Desired capabilities对象,添加启动参数
desired_caps = {
"platformName": "Android", # 系统名称
"platformVersion": "7.1.2", # 系统版本
"deviceName": "127.0.0.1:21503", # 设备名称
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP启动名
}
# 3.启动APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
# 4.定位元素
blue_tooth = driver.find_element_by_android_uiautomator('new UiSelector().text("蓝牙")')
# 4.1 获取元素坐标
print("蓝牙坐标: ", blue_tooth.location)
# 输出结果:
# 蓝牙坐标: {'x': 86, 'y': 265}
# # 得到的坐标为元素左上角的坐标。
# 4.3 获取手机的宽度和高度
size = driver.get_window_size() # 获取手机屏幕大小
print(size) # {'width': 576, 'height': 1024}
# 6.关闭APP
time.sleep(3)
driver.quit()
https://github.com/appium/sample-code/tree/master/sample-code/examples/python
启动验证:
启动之后,在浏览器中输入http://localhost:4723/wd/hub/status出现下面代码说明成功
{“status”:0,“value”:{“build”:{“version”:“1.12.1”}},“sessionId”:null}
下载地址:https://github.com/appium/sample-code/tree/master/sample-code
添加联系人的示例代码
下载后的原始文档如下:
修改后,如下
Appium 如何模拟返回按键
from appium.webdriver import Remote
driver.keyevent(4)
python中点击返回键是这样写的
电话键
KEYCODE_CALL 拨号键 5
KEYCODE_ENDCALL 挂机键 6
KEYCODE_HOME 按键Home 3
KEYCODE_MENU 菜单键 82
KEYCODE_BACK 返回键 4
KEYCODE_SEARCH 搜索键 84
KEYCODE_CAMERA 拍照键 27
KEYCODE_FOCUS 拍照对焦键 80
KEYCODE_POWER 电源键 26
KEYCODE_NOTIFICATION 通知键 83
KEYCODE_MUTE 话筒静音键 91
KEYCODE_VOLUME_MUTE 扬声器静音键 164
KEYCODE_VOLUME_UP 音量增加键 24
KEYCODE_VOLUME_DOWN 音量减小键 25
控制键
KEYCODE_ENTER 回车键 66
KEYCODE_ESCAPE ESC键 111
KEYCODE_DPAD_CENTER 导航键 确定键 23
KEYCODE_DPAD_UP 导航键 向上 19
KEYCODE_DPAD_DOWN 导航键 向下 20
KEYCODE_DPAD_LEFT 导航键 向左 21
KEYCODE_DPAD_RIGHT 导航键 向右 22
KEYCODE_MOVE_HOME 光标移动到开始键 122
KEYCODE_MOVE_END 光标移动到末尾键 123
KEYCODE_PAGE_UP 向上翻页键 92
KEYCODE_PAGE_DOWN 向下翻页键 93
KEYCODE_DEL 退格键 67
KEYCODE_FORWARD_DEL 删除键 112
KEYCODE_INSERT 插入键 124
KEYCODE_TAB Tab键 61
KEYCODE_NUM_LOCK 小键盘锁 143
KEYCODE_CAPS_LOCK 大写锁定键 115
KEYCODE_BREAK Break/Pause键 121
KEYCODE_SCROLL_LOCK 滚动锁定键 116
KEYCODE_ZOOM_IN 放大键 168
KEYCODE_ZOOM_OUT 缩小键 169
组合键
KEYCODE_ALT_LEFT Alt+Left
KEYCODE_ALT_RIGHT Alt+Right
KEYCODE_CTRL_LEFT Control+Left
KEYCODE_CTRL_RIGHT Control+Right
KEYCODE_SHIFT_LEFT Shift+Left
KEYCODE_SHIFT_RIGHT Shift+Right
基本
KEYCODE_0 按键'0' 7
KEYCODE_1 按键'1' 8
KEYCODE_2 按键'2' 9
KEYCODE_3 按键'3' 10
KEYCODE_4 按键'4' 11
KEYCODE_5 按键'5' 12
KEYCODE_6 按键'6' 13
KEYCODE_7 按键'7' 14
KEYCODE_8 按键'8' 15
KEYCODE_9 按键'9' 16
KEYCODE_A 按键'A' 29
KEYCODE_B 按键'B' 30
KEYCODE_C 按键'C' 31
KEYCODE_D 按键'D' 32
KEYCODE_E 按键'E' 33
KEYCODE_F 按键'F' 34
KEYCODE_G 按键'G' 35
KEYCODE_H 按键'H' 36
KEYCODE_I 按键'I' 37
KEYCODE_J 按键'J' 38
KEYCODE_K 按键'K' 39
KEYCODE_L 按键'L' 40
KEYCODE_M 按键'M' 41
KEYCODE_N 按键'N' 42
KEYCODE_O 按键'O' 43
KEYCODE_P 按键'P' 44
KEYCODE_Q 按键'Q' 45
KEYCODE_R 按键'R' 46
KEYCODE_S 按键'S' 47
KEYCODE_T 按键'T' 48
KEYCODE_U 按键'U' 49
KEYCODE_V 按键'V' 50
KEYCODE_W 按键'W' 51
KEYCODE_X 按键'X' 52
KEYCODE_Y 按键'Y' 53
KEYCODE_Z 按键'Z' 54