2025年6月4日 星期三 乙巳(蛇)年 三月初八 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

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

时间:08-21来源:作者:点击数:46
城东书院 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
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐