一、安装环境
(1)安装Java SDK和Android SDK,详情见APP测试APP测试_雷鸣的击的博客-CSDN博客
(2)安装node.js
下载地址: https://nodejs.org/en/
备注:尽量安装老版本的node,新版本对appium不适配,在使用中容易出现各种不知名错误
验证环境是否安装成功:
(3)安装Appium
下载地址: https://github.com/appium/appium-desktop/releases
(4)Python环境
下载地址: https://www.python.org/downloads/windows/
下载后直接安装即可;需要勾选添加到PATH;这样系统变量就不用加了
验证环境是否安装成功:
1、打开cmd,输入python,正常显示即安装成功
(5)安装Appium-python-clienf
通过命令: pip install Appium-Python-Client 进行安装
检测安装:在python中输入 from appium import webdriver 回车
控制台没有报错则说明安装成功
二、使用appium获取元素信息
1、打开appium,填入信息,点击【Start Server】
2、点击右上角放大镜标志
3、进入如下图
4、在Desired Capabilities 或Saced Capabilities Sets下填写需要获取APP元素的配置。点击Save As保存下来
5:点击
如下图,即可参考元素的属性信息
三、appium常用命令操作
1、连接打开APP
from appium import webdriver
desired_capabilities={
'platformName':'Android' #系统
'deviceName':'192.168.199.1:5555' #设备型号,Android无效,但配置项不能缺少,ISO系统有效
'platformVersion':'7.0' #版本
'appPackage':'com.neweggcn.app' #APP的包名
'appActivity':'com.neweggcn.app.MainActivity' #启动的ativity名称
driver=webdriver.Remote('http://localhost:4723/wb/hub',desired_capalilities) #地址为Appium地址
capabilitiy配置较多,可以根据具体要求进行配置。
2、定位
(1)id定位
id定位是根据属性resource-id进行定位的
注意:app的resource-id属性不唯一,这是seleium的id定位的区别
driver.find_element_by_id("com.newggcn.app:id/tools_order_traching")
(2)class name定位
一般很少使用,因为class属性没有标识性。
driver.find_element_by_class_name()
(3)accessibility id定位
accessibility id定位是根据content-desc属性定位,使用较少,因为大部分时候content-desc为空的。
driver.find_element_by_accessibility_id()
(4)Xpath定位
driver.find_element_by_xpath()
(5)UIAutomator定位
该定位方式使用较少,通过调用Android UIAutomator类库去找元素。
driver.find_element_by_android_uiautomator()
(6)By定位
from appium.webdriver.common.mobileby import MobileBy as By
driver.find_element(BY.XPATH,locator) #通过xpath定位
driver.find_element(BY.ID,locator) #通过resource-id属性定位
driver.find_element(BY.CLASS_NAME,locator) #通过class属性定位
driver.find_element(BY.ACCESSIBILITY_ID,locator) #通过content-desc属性定位
driver.find_element(BY.ANDROID_UIAUTOMATOR,locator) #通过UIAUTOMATOR定位
3、元素操作
locator=driver.find_element_by_accessibility_id()
locator.click() #点击元素
locator.clear() #清空元素文本文字
locator.send_keys() #模拟输入值
driver.contexts #获取上下文
driver.current_context #获取当前所在上下文
driver.switch_to_context() #切换到指定的context
driver.current_activity #获取当前activity
locator.text #获取当前元素的text属性的值
locator.get_attribute() #获取当前元素指定的属性值
locator.size #获取元素大小
locator.location #获取元素左上角的坐标
locator.is_selected() #检查元素是否被选中
locator.is_enabled() #检查元素是否可用
locator.is_displayed() #检查元素是否可见
driver.get_windoe_size(windowHandle='current') #获取窗口大小
(1)多点触摸
driver.top(postitions,durations=None)
postitions:具体坐标,格式是列表包含的元组
durations:点击的时间,单位毫秒
例子
driver.top([(100,5),(20,10),(50,100)],500)
点击这三个坐标点,时间为500毫秒
(2)元素拖动
driver.scroll(origin_el,destinarion_el)
origin_el:开始元素
destinarion_el:结束元素
dl1=driver.find_element_by_id()
dl2=driver.find_element_by_id()
driver.scroll(el1,el2)
driver.drag_and_drop(origin_el,destinarion_el)
drag_and_drop和scroll区别在于drag_and_drop在开始元素长按100毫秒,而scrol不会停顿。
(3)屏幕滑动
driver.swipe(start_x,start_y,end_x,end_y,duration=None)
driver.flick(start_x,start_y,end_x,end_y)
参数分别为开始的X、Y坐标,结束X、Y坐标,swipe和flick区别在于滑动延迟时间设置,duration单位是毫秒。
(4)隐藏键盘
系统可能会自带软键盘,会影响测试,可以通过hide_keyboar()进行隐藏
driver.hide_keyboard()
(5)等待
driver.wait_activity(activity,timeout,interval=1)
activty:等待目标activity
timeout:超时时间
interval:间隔几秒检查一次
其它等待与seleium一样。
(6)截图
driver.get_screenshot_as_file()
driver.save_screenshot()
除了上述两种常用的方式外,还可以将图片保存为字符串
driver.get_screenshot_as_base64() #该方法返回一个base64字符串
将base字符串写入文件中
import base64 #引入base64
base64.b64decode(base64字符串) #转化为二进制图片,再写入文件即可,使用“wb”方式打开文件
(7)TouchAction 类
from appium.webdriver.common.touch_action import TouchAction #引入
action=TouchAction(driver) #实例化类
1)tap触摸
触摸元素或者坐标点
action.tap(element=None,x=None,y=None,count=1)
element:元素对象
count:触摸次数
2)press 短按
模拟手指在某个元素或坐标点按下
action.press(element=None,x=None,y=None)
3)long_press 长按
模拟手指在某个元素或坐标点按下,可设置按下的持续时间。
action.long_press(element=None,x=None,y=None,duration=100)
4)wait等待
模拟操作过程中的等待时间,单位毫秒
action.wait(ms=0)
5)move_to移动
从上一个元素或坐标移动到目标元素或坐标
action.move_to(element=None,x=None,y=None)
6)release释放
如果有按下操作(press、long_press)时,需要使用release()方法释放按下操作
action.release()
7)perform提交
使用该方法后,TouchAction类的方法才会执行。
action.perform()