前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于python的appium例子

基于python的appium例子

作者头像
周小董
发布2019-05-10 11:34:29
2.1K0
发布2019-05-10 11:34:29
举报
文章被收录于专栏:python前行者python前行者

版权声明:如需转载本文章,请保留出处! https://blog.csdn.net/xc_zhou/article/details/89643551

1、开始前需要知道的框架

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

2、android模拟器的配置和启动(这里使用AVD模拟器)

打开AVD-manager,点击create按钮,创建一个android模拟器,写好配置,如下图

image.png
image.png

重点关注name和target,可以看到,这里配置了一个5.0.1,API LEVEL为21

配置完之后启动模拟器,模拟器启动很慢。

image.png
image.png

模拟器就好了。

代码语言:javascript
复制
#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()

测试用例中用到的api

代码语言:javascript
复制
# -*- coding:utf-8 -*-
from appium import webdriver

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')
start_btn = driver.find_element_by_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)')
'''
以上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()
#启动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()

更多参考:http://blog.csdn.net/crisschan/article/details/50416860 http://www.cnblogs.com/fanxiaojuan/p/4882676.html

代码语言:javascript
复制
# 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()

获取appPackage和appActivity:

1、在之前配置的android SDK文件中找到这个程序,并双击打开

image
image

在连好手机的情况下点击这个按钮,界面上就会显示出当前手机的页面(如果是锁屏状态则显示黑屏)

image
image

左上角一共四个按钮,作用分别是打开本地文件、dump页面、dump压缩格式的页面、保存;

image
image

界面加载出来之后,加入我们想定位百度一下的文本框,那么吧光标移动到上面点击一下即可,下图框出的部分为我们需要的信息:

image
image

通过这个信息我们知道,对于这个包,上方desired_caps字典中appPackage的值应填写为 com.baidu.search

appActivity的获取:

先让百度在手机中运行起来,然后在cmd中输入:adb shell dumpsys activity activities (获取当前所有的活动),搜索结果如下:

image
image

上方将所有进程显示出来,活动进程很多比较难找,这里知道package名称,可以在结果中进行查找,得到appActivity的值为MainActivity

关于这里的定位还有其他方法,详情参看大神的博客:http://blog.csdn.net/shyu1989/article/details/51730214

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年04月28日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 测试用例中用到的api
  • 获取appPackage和appActivity:
  • appActivity的获取:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档