1.测试环境搭建
1.1安装appium前的准备
安装python3.5、jre8、node.js 6、android-sdk、.net Framework4.6.1,并配置系统环境变量。
系统环境变量:
1.1.1 python3.5
path: D:\Program Files\python;D:\Program Files\python\Scripts;D:\Program Files\python\lib\site-packages\pytz-2017.2-py3.5.egg;
1.1.2 jre8
JAVA_HOME:D:\Program Files\Java\jdk1.8.0_101
path:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
1.1.3 node.js
path:D:\Program Files\nodejs\;
1.1.4 android-sdk
ANDROID_HOME:D:\Program Files\Android\android-sdk
path:%ANDROID_HOME%\tools;%ANDROID_HOME%\build-tools\26.0.1;%ANDROID_HOME%\platform-tools;
1.2安装appium
1.2.1 安装appium客户端
下载并安装appium客户端,环境变量配置如下:
Appium_Home:D:\Program Files\Appium
path:%Appium_Home%;%Appium_Home%\node_modules\.bin;
使用pip安装Appium-Python-Client:pip install Appium-Python-Client
1.2.2 使用npm安装
使用npm安装appium,方法为:npm install appium
使用pip安装Appium-Python-Client:pip install Appium-Python-Client
1.3检验是否安装成功
1.3.1 检验appium客户端是否安装成功
启动appium客户端,
window+R+cmd-> appium,出现以下提示,则证明安装成功。
Running Android Checks
✔ ANDROID_HOME is set to "D:\Program Files\Android\android-sdk"
✔ JAVA_HOME is set to "D:\Program Files\Java\jdk1.8.0_101."
✔ ADB exists at D:\Program Files\Android\android-sdk\platform-tools\adb.exe
✔ Android exists at D:\Program Files\Android\android-sdk\tools\android.bat
✔ Emulator exists at D:\Program Files\Android\android-sdk\tools\emulator.exe
✔ Android Checks were successful.
✔ All Checks were successful
反之,则需要根据出现的错误提示进行修改,直到出现以上提示为止。
1.3.2 检验使用npm安装的appium是否安装成功
window+R+cmd-> appium,出现以下提示,则证明安装成功。
[Appium] Welcome to Appium v1.7.0
[Appium] Appium REST http interface listener started on 0.0.0.0:4723
反之,则需要根据出现的错误提示进行修改,直到出现以上提示为止。
1.3.3 常见问题
常见问题:端口被占用,解决办法
①window+R+cmd 调出命令窗口。
②输入命令:netstat -ano,列出所有端口的情况。
③查看被占用端口对应的PID,输入命令:netstat -aon|findstr "端口号",回车,记下最后一位数字,即PID
④输入tasklist|findstr "PID",回车,查看是哪个进程或者程序占用了端口
⑤输入taskkill /f /t /im 进程/程序,回车,结束进程
[④⑤亦可替换成 直接操作任务管理器,根据PID结束进程]
2.实例
2.1 连接手机,启动、退出APP
(1)启动appium:点击按钮启动客户端或者window+R+cmd-> appium。
(2)调用代码中所示的Appium_Contect类,get_driver启动、quit_driver退出。
# -*- coding:utf-8 -*-
from appium import webdriver
class Appium_Contect:
def __init__(self,reset):
self.desired_caps = {'platformName': 'Android',
'deviceName': 'emulator-5554',
'app':'要安装的App路径',#
'appPackage': '被测的App包名',
'appActivity': '启动时的Activity',
'noReset': reset,#是否重置,清除数据。true不重置,false重置
"unicodeKeyboard":True,
"resetKeyboard":True}
self.driver = webdriver.Remote('http://localhost:4723/wd/hub', self.desired_caps)
def get_driver(self):
return self.driver
def quit_driver(self):
self.driver.quit()
if __name__=='__main__':
ac=Appium_Contect(True)
ac.get_driver()
ac.quit_driver()
2.2 基于UI的自动化操作
2.3.1 获取控件
通过uiautomatorviewer(D:\Program Files\Android\android-sdk\tools\uiautomatorviewer.bat)可以获取到ID、class、Text等。
appium为了实现自己的find查找方式,首先自定义了一个MobileBy类,给这个类对象塞入了它定义的一些扩展属性,这些属性的值会通过webdriver协议推送到server端去识别和执行,为了让这些属性运用到find方法中,appium很好地继承和扩展了webdriver.Remote,然后通过调用driver实例的find_element和find_elements两个核心方法实现元素查找,所以,既然是扩展,appiumdriver实例可以使用seleniumdriver的所有关于元素查找的实例方法,如下:
seleniumdriver
find_element_by_id find_elements_by_id
find_element_by_name find_elements_by_name
find_element_by_link_text find_elements_by_link_text
find_element_by_partial_link_text find_elements_by_partial_link_text
find_element_by_tag_name find_elements_by_tag_name
find_element_by_xpath find_elements_by_xpath
find_element_by_class_name find_elements_by_class_name
find_element_by_css_selector find_elements_by_css_selector
appiumdriver
find_element_by_ios_uiautomation find_elements_by_ios_uiautomation
find_element_by_android_uiautomator find_elements_by_android_uiautomator
find_element_by_accessibility_id find_elements_by_accessibility_id
调用这些实例方法实现起来类似于:
self.driver.find_element_by_id(recourceId)
self.driver.find_elements_by_id(recourceId)
self.driver.find_element_by_xpath(xpath)
self.driver.find_elements_by_xpath(xpath)
2.3.2 常用事件
(1)是否存在
len(self.driver.find_elements_by_id(recourceId))==0
(2)点击
self.driver.find_elements_by_id(recourceId).click()
(3)滑动
self.driver.swipe(x1, y1, x2, y2, 500)#从起始点(x1,y1)滑动到(x2,y2)
(4)长按
action = TouchAction(self.driver)
el = self.driver.find_element_by_id("com.easemob.businesslink:id/btn_press_to_speak")
action.long_press(el=el,duration=2000).wait(1000).perform()[等待1000ms后长按2000ms]
(5)设置文本
self.driver.find_elements_by_id(recourceId).send_keys("123456")
[待补充......]