Appium+Python做移动端自动化测试
作者:bacon刘 发布时间:[ 2017/4/20 14:51:18 ] 推荐标签:自动化测试 Python
3.2.3 针对iOS10升级appium到1.6.3解决方案
由于iOS10放弃了uiautomator,改用XCUITest来进行测试。appium1.6.0之前的版本全部采用uiautomator来进行自动化测试,基于这次iOS的调整,appium1.6.0之后的版本添加了WebDriverAgent依赖来应对这次iOS的调整。这里,我针对appium1.6.3的升级过程做描述。
安装carthage,brew install carthage
安装xcpretty,gem install xcpretty
在安装好appium旧版情况下,卸载appium。npm uninstall –g appium.
安装appium1.6.3,npm install –g appium。(这个过程会很难成功,但是,我们能做的是不停尝试,直到安装成功为止。)
安装WebDriverAgent,cd /usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent(如果不在此目录,自行查找)
mkdir –p Resources/WebDriverAgent.bundle
sh ./Scripts/bootstrap.sh –d(这步可能会报错,去下一个vpn,开启服务,再次下载ok了,这里推荐“star vpn”很不错的vpn)
cd /usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent用xcode打开WebDriverAgent.xcodeproj。修改项目的Bundle identifier.要包Bundle identifier的Facebook改成其他东西。Signing,要选Automatically manage signing,开发者选自己的账号或者用证书进行编译,项目的所有bundle identifier都要该。改完后, build。
关闭xcode,在终端cd /usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent。
xcodebuild –project WebDriverAgent.xcodeproj –scheme WebDriverAgentRunner –destination 'id=真机的udid' test.
如果运行结果报错为“Test target WebDriverAgentRunnerencounted an error (Early unexpected exit,operationnever finished bootstrapping –no restart will be attempted)”则忽略不计。
到此升级工作完成,注意:在安装WebDriverAgent到手机的时候必须保持手机连接外网。当然,在使用的过程中同样要连接外网。(如果WedDriverAgent是用证书进行编译的则在使用过程中不用连接外网)
由于,appium1.6.3为推出GUI版本,这里做元素定位的时候,我们用macaca进行定位,macaca安装教程网上查询。
app-inspector是macaca的元素定位工具,使用命令,在终端输入:app-inspector –u "设备的udid"
3.3 Linux版安装
3.3.1 软件列表
Linux Ubuntu Destop 14.04以上版本
brew
ruby
git
curl
node
jdk
appium
Android sdk
Python Appium客户端:Appium-Python-Client、Selenium
3.3.2 安装过程
Appium Server 的安装
【参考https://coderwall.com/p/rcvkrq/install-nodejs-using-homebrew-and-install-appium】
1. 删除nodejs : sudo apt-get remove nodejs。但是默认的系统nodejs没有,这一步可做可不做。
2. 安装ruby:sudo apt-get install ruby
确认ruby 安装成功:
ruby -v有ruby的版本信息。
3. 安装git:sudo apt-get install git
4. 安装brew:ruby -e "$(wget -O- https://raw.github.com/Homebrew/linuxbrew/go/install)"
如果上面执行不成功的话可以用下面这句git clone https://github.com/Homebrew/linuxbrew.git ~/.linuxbrew
5. 安装curl:sudo apt-get install curl
6. 安装node.js:一定不能用sudo,直接普通用户安装(确认之前文件环境配置好后,如果安装下载失败多试几次)
brew install node
如果上面执行不成功的话用这种方法:sudo apt-get install g++。
sudo apt-get install libssl-dev。
wget http://nodejs.org/dist/v5.6.0/node-v5.6.0.tar.gz。
tar zxvf node-v5.6.0.tar.gz。
./configure(注:这句话要切到node的bin目录下执行)。
make。
make install。
sudonpm install –g express-generator@4(全局模式安装)。
可能会比较慢(本机安装15分钟左右),耐心等待nodejs安装成功。
查看安装完成
node -v
7. 安装 Java 虚拟机
下载JDK,下载新Java SDK
解压安装
我们把JDK安装到这个路径:/usr/lib/jvm
如果没有这个目录(第一次当然没有),我们新建一个目录
1)cd /usr/lib
2)sudo mkdir jvm
建立好了以后,我们来到刚才下载好的压缩包的目录,解压到我们刚才新建的文件夹里面去,并且修改好名字方便我们管理,(根据版本名自己修改名字)
1)sudo tar zxvf ./jdk-7-linux-i586.tar.gz -C /usr/lib/jvm
2)cd /usr/lib/jvm
3) sudo mv jdk1.7.0_05/ jdk7
配置JAVA环境变量
gedit ~/.bashrc
在打开的文件的末尾添加
export JAVA_HOME=/usr/lib/jvm/jdk7
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
保存退出,然后输入下面的命令来使之生效
source ~/.bashrc
配置默认JDK
由于一些Linux的发行版中已经存在默认的JDK,如OpenJDK等。所以为了使得我们刚才安装好的JDK版本能成为默认的JDK版本,我们还要进行下面的配置。
执行下面的命令:
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk7/bin/java 300
sudo update-alternatives --install /usr/bin/javacjavac /usr/lib/jvm/jdk7/bin/javac 300
注意:如果以上两个命令出现找不到路径问题,只要重启一下计算机在重复上面两行代码OK了。
执行下面的代码可以看到当前各种JDK版本和配置:
sudo update-alternatives --config java
测试
打开一个终端,输入下面命令:
java -version
显示结果(JDK1.8):
java version "1.8.0_05"
Java(TM) SE Runtime Environment (build 1.8.0_05-b05)
Java HotSpot(TM) Server VM (build 23.1-b03, mixed mode)
这表示java命令已经可以运行了。
8. 安装appium
全局安装appium,本机安装的是1.4.16版本(如果不加版本名会自动安装新版本),通过npm淘宝镜像
通过config命令
npm config set registry https://registry.npm.taobao.org (这里是为下面一句服务的,即把appium的下载数据源指向淘宝库)
npm install -g appium@1.4.16
如果安装失败用root账号进行安装?安装完之后,
cd /usr/local/lib
sudo chown –R 主机名字 node_modules
然后卸载:
npm uninstall appium –g
之后再普通用户下启动appium
可能会比较慢,耐心等待安装成功,如果安装失败重复执行安装命令(如果之前有安装过错误的版本,提示得删除之前的文件,删除之后在安装)。
安装成功会出现树状依赖关系图
查看版本
appium -v
9. 下载安装Android SDK Starter Package
Android SDK Starter Package这个只是SDK的核心基本工具,有了它,再利用它的管理工具下载其他你需要到部分。看到这个目录中有个android脚本文件了吗?执行它,会启动Android SDK and AVD Manager,这个工具可以帮你下载其他你需要的部分,还可以创建模拟机。
下载地址是:http://developer.android.com/sdk/index.html,不过国内这个地址被墙掉了,你要想版本下载包了。
一般是下载新版,我下载的:android-sdk_r21.1-linux.tgz。
wget http://dl.gmirror.org/android/android-sdk_r24.4.1-linux.tgz
接下来当然是解包了:tar zvxf android-sdk_r21.1-linux.tgz
解包完毕,会在当前目录下出现android-sdk-linux_x86目录了。这个目录下是sdk的基本工具了。记住这个目录,因为以后你运行工具或者设置ADT的时候,会需要这个目录的!。
注意,需要安装ia32-libs
sudo apt-get install -y libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5 lib32z1
配置 Android SDK
配置 Android 环境变量,将下面的变量添加到环境变量当中去(根据自己sdk存放的文件夹修改路径,注意HOME为当前用户目录下)
export ANDROID_HOME="$HOME/adt/sdk"
export PATH=${PATH}:~/adt/sdk/tools
export PATH=${PATH}:~/adt/sdk/platform-tools
然后source
source ~/.bashrc
10. 安装Appium客户端(ubuntu系统自带python2.7和python3.4版本)
安装Appium-Python-Client(使用pip安装)
sudo apt-get install python-pip
sudo pip install Appium-Python-Client
(可能会失败,多试几次)
安装 selenium 2.0(/usr/local/lib/python2.7/dist-packages下也有无需安装)
sudo apt-get install selenium
测试Appium
测试appium环境安装正确与否
appium-doctor
所有环境都打钩为正确配置好环境,查看上面的JAVA_HOME和ANDROID_HOME环境配置是否正确
命令行敲入appium
出现 welcome to appium v1.4.16 代表安装成功
测试项目
将项目放到/python2.7/dist-packages文件夹下测试运行
完成!!!
第四章 控件识别
4.1 控件识别(Windows)
启动Appium后,用Appium Inspector进行控件识别(如下图),可以进行点击和输入操作(Tap、Text),右边的界面会根据操作实时更新,方便连续识别控件。
4.2 控件识别(Mac)
启动Appium后,用Appium Inspector进行控件识别(如下图)。
4.3 tips
Appium终端版本启动命令:
Linux下启动命令:appium -a 127.0.0.1 -p 端口号 -bp 端口号 --session-override --no-reset
Mac下启动命令:appium -a 127.0.0.1 -p 端口号 -bp 端口号 --session-override --no-reset --tmp 路径
Mac下启动多个appium(小于1.6.0的版本)会有冲突,所以必须要对每个appium自定一个不同的数据缓存目录。因此,tmp后面的参数不能相同。appium(大于1.6.0)由于引进了WebDriverAgent,同时运行个appium客户端会导致wda的pc端端口重复,可以在测试脚本中指定setCapability("wdaLocalPort","端口一"),确保每个appium客户端wdaLocalPort端口不同。
Appium长时间运行报错:FATAL ERROR:CALL_AND_RETRY_LAST Allocation failed – process out of memory 已放弃(核心已转储)。判断为node内存溢出。这是node的bug。
第五章 python脚本实例
driver对象类
from appium import webdriver
import time
from selenium.common.exceptions import NoSuchElementException
class driverObject:
def __init__(self, host, port, platform, version, deviceName, noReset, unicodeK, resetK, appPath ,appP_bdId, appA_udid, localPort):
#__appP_bdId = "com.yitong.fjnx.mbank.android"
__appP_bdId = appP_bdId
#__appA_udid = ".Splash"
__appA_udid = appA_udid
self.pwmode = 'lower'
self.model='Appium'
self.desired_caps = {}
self.desired_caps['platformName'] = platform
self.desired_caps['platformVersion'] = version
self.desired_caps['noReset'] = noReset
self.desired_caps['unicodeKeyboard'] = unicodeK
self.desired_caps['resetKeyboard'] = resetK
self.desired_caps['app'] = appPath
self.desired_caps['udid'] = deviceName
self.desired_caps['deviceName'] = deviceName # Android - ignored, iOS - iPhone name
if platform == "Android":
self.desired_caps['appPackage'] = __appP_bdId
self.desired_caps['appActivity'] = __appA_udid
if platform == "iOS":
self.desired_caps['bundleId'] = __appP_bdId
self.desired_caps['automationName'] = 'XCUITest'
self.desired_caps['wdaLocalPort'] = localPort
url = "http://" + host + ":" + str(port) + "/wd/hub"
self.driver = webdriver.Remote(url, self.desired_caps)
time.sleep(5)
def get_driver(self):
return self.driver
def quit(self):
self.driver.quit()
主类
from testClass import driverObject
if __name__ == '__main__':
driver = driverObject(参数...)
ele = self.driver.find_elements_by_class_name("android.widget.Button")
ele[0].click()
time.sleep(5)
ele = self.driver.find_elements_by_class_name("android.widget.EditText")
ele[1].send_keys("account")
ele[2].send_keys("password")
ele = self.driver.find_elements_by_class_name("android.widget.Button")
time.sleep(2)
ele[0].click()
driver.quit()
关于Appium、Python的测试脚本公共函数可以查阅Appium-Python-Api文档,里面记录Appium提供给python的公共函数。其实,测试脚本的大部分内容是找控件、点击控件、输入内容、线程等待这些操作。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11