您当前的位置:首页 > 计算机 > 编程开发 > Python

python运行Appium驱动手机相关用法

时间:08-21来源:作者:点击数:
城东书院 www.cdsy.xyz

官方:https://github.com/appium/python-client

https://pypi.org/project/Appium-Python-Client/

https://www.androiddevtools.cn/

http://appium.io/

首先确保appium环境及依赖安装好

Appium Desktop应用

由于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、成功启动后如图


appium元素定位方法

appium元素定位工具

app应用的元素使用的是控件定位,不同于web网页,web网页定位元素通常使用的是F12工具,那么在app当中我们则要借助其它的工具来辅助定位。

uiautomatorviewer.bat

uiautomatorviewer.bat工具在安装完ADT工具之后,位于ADT安装路径的android-sdk-windows\tools目录下

双击启动即可,启动之后,在初始界面上,点击如图位置按钮可以进行截屏

截屏后即可查看各个元素,截屏后的效果:

appium检查器

在appium启动后的日志窗口界面,点击“启动检查器会话”,会跳转到检查器启动参数配置界面,参数配置直接将我们代码里面的启动参数搬过来就可以了。

image.png

点击启动后,会根据我们配置的应用信息,自动跳转到应用的主页面,我们就可以开始进行元素定位了:

常用元素定位方法

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以上

  • 提供了一系列API:执行UI测试在系统或者第三方app上面
  • 允许在被测设备上执行操作,比如打开系统设置菜单
  • 适合编写黑盒自动化测试

UIAutomator框架的主要特点:

  • 元素定位:UI Automator Viewer。扫描、分析待测应用的UI组件的图像工具
  • 元素操作:Accessing device state。在目标设备和app上各种操作
  • 元素识别:UI Automator APIs。在多个应用程序中捕获和操作UI组件

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()
contains模糊定位

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("百货"))')

appium相关用法

运行一个demo需要如下三个主要部分:android模拟器已经启动;appium服务已经开启,以及python相关的环境准备好了

  • appium安装
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)

基于python的appium综合练习

计算器例子
#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()
APP中webview页面的操作方法
"""
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()
appium获取元素坐标
"""
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()

Python官方示例(sample-code)

https://github.com/appium/sample-code/tree/master/sample-code/examples/python

  • 启动Appium,并确保已经连接模拟器

启动验证:

启动之后,在浏览器中输入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

添加联系人的示例代码

  • 下载对应APK
  • 下载Python执行文件
  • 修改android_contacts.py文件

下载后的原始文档如下:

修改后,如下


Appium按键说明

Appium 如何模拟返回按键

from appium.webdriver import Remote

driver.keyevent(4)

python中点击返回键是这样写的

  • 附录 keycode
电话键

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
城东书院 www.cdsy.xyz
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐