官方: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
-