基于python的appium例子

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

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

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

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

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

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

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

模拟器就好了。

#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

# -*- 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

# 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文件中找到这个程序,并双击打开

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

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

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

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

appActivity的获取:

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券