目录
一、安装命令行appium
1.1、安装node.js
1.2、安装cnpm
1.3、安装appium,注意cmd命令行窗口要用管理员运行,否则会安装失败
二、代码启动命令行appium server
2.1启动appium server
2.2验证是否启动成功
2.3关闭appium server
2.4代码
前面我们已经安装了appium server gui,每次自动化测试都要手动启动它,然后才能开始,这样不是很自动,我们自然想用脚本启动appium server了。
研究了半天,总是启动失败,设置好环境变量后启动报这个错
后来研究发现是要安装一个命令行的版本,安装如下
我们在APP自动化测试(1)-工具安装中已经讲过了,需要的进去看一下node.js安装
1.命令行输入
npm install -g cnpm --registry=https://registry.npm.taobao.org
2.安装完成后cnpm -v,显示版本号即可
cmd 输入:cnpm install -g appium
安装完成后,输入appium即可启动
后面可通过命令行启动appium,并切制定端口和ip
安装报错,提示
C:\Windows\system32>ERROR: Failed to set up Chromium r1095492! Set "PUPPETEER_SKIP_DOWNLOAD" env variable to skip download.
Error: Download failed: server returned code 404. URL: https://cdn.npmmirror.com/binaries/chromium-browser-snapshots/Win_x64/1095492/chrome-win.zip
根据提示环境变量中设置参数PUPPETEER_SKIP_DOWNLOAD 值为true
如下图
继续运行命令安装,还是有错误,如下
[email protected] › appium-chromedriver@^4.23.1 postinstall, finished in 3s
Install fail! Error: run postinstall error, please remove node_modules before retry!
Command failed with exit code 1: node install-npm.js
Error: Command failed with exit code 1: node install-npm.js
at makeError (C:\Users\86181\AppData\Roaming\npm\node_modules\cnpm\node_modules\execa\lib\error.js:60:11)
at handlePromise (C:\Users\86181\AppData\Roaming\npm\node_modules\cnpm\node_modules\execa\index.js:118:26)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async exports.runScript (C:\Users\86181\AppData\Roaming\npm\node_modules\cnpm\node_modules\npminstall\lib\utils.js:262:12)
at async runLifecycleScripts (C:\Users\86181\AppData\Roaming\npm\node_modules\cnpm\node_modules\npminstall\lib\lifecycle_scripts.js:64:7)
at async _install (C:\Users\86181\AppData\Roaming\npm\node_modules\cnpm\node_modules\npminstall\lib\install_package.js:318:5)
at async install (C:\Users\86181\AppData\Roaming\npm\node_modules\cnpm\node_modules\npminstall\lib\install_package.js:23:12)
at async mapper (C:\Users\86181\AppData\Roaming\npm\node_modules\cnpm\node_modules\npminstall\lib\install_package.js:270:9)
npminstall version: 7.5.0
npminstall argv: C:\Program Files\nodejs\node.exe C:\Users\86181\AppData\Roaming\npm\node_modules\cnpm\node_modules\npminstall\bin\install.js --fix-bug-versions --china --userconfig=C:\Users\86181\.cnpmrc --disturl=https://npmmirror.com/mirrors/node --registry=https://registry.npmmirror.com -g appium
**INFO** Skipping browser download as instructed
运行appium还是无法成功,无奈之下通过npm安装,运行如下命令
C:\Users\86181\AppData>npm install appium -g
下面是运行输出
added 655 packages, changed 31 packages, and audited 687 packages in 29s
41 vulnerabilities (10 moderate, 18 high, 13 critical)
To address issues that do not require attention, run:
npm audit fix
To address all issues possible (including breaking changes), run:
npm audit fix --force
Some issues need review, and may require choosing
a different dependency.
Run `npm audit` for details.
看起来没什么明显错误,运行appium命令试试,如下,安装成功1.22.3版本,是最新版本
执行app自动化的前提工作,启动appium server,验证是否启动成功,启动成功后建立WebDriver对象。建立WebDriver对象我们在前面已经讲过了,直接把代码抄过来就行,这里主要讲启动appium server 和验证是否启动成功。
本质是用命令行启动,利用python执行启动appium server的命令行命令。
命令为:start /b appium -a host -p port -bp bootstrap_port
参数说明: start /b 表示后台执行
-a host 为指定的服务器IP,如果都在本机执行就用127.0.0.1
-p port 监听端口,客户端连接服务端的端口,也就是Remote中的端口
-bp 连接设备的端口,如果连接对台设备进行测试,就需要设不同的bp端口
appium server启动后会有一个http的服务,我们通过方法http://127.0.0.1:port/wd/hub/status地址,如果返回状态码是200则表示启动成功了。
服务启动成功用完后要关闭进程,否则下次启动会由于端口已经被占用而无法使用。
我们通过netstat -aon|findstr “port”找到对应的进程ID,如果进程ID不为0,表示该端口正在被监听,我们用 taskkill /f /pid pid 强制关掉
进行简单的函数封装
'''
1、命令行启动appium server
2、判断是否启动成功
3、关闭启动的经常
'''
import subprocess
import multiprocessing
import time
import urllib.request
from urllib import request
import os
def kill_process(port):
"""
根据端口找到进程ID,然后关闭
"""
#通过如下命令找到端口为port的所有进程信息
#返回的是 TCP 127.0.0.1:4738 0.0.0.0:0 LISTENING 14520
cmd = "netstat -aon|findstr "+str(port)
p = os.popen(cmd)
#取第一行数据,第一行为正在监听端口的进程信息
pid_str = p.read().split("\n")[0]
#用空格切分为列表
pid_l =pid_str.split(" ")
#删除为''的所有元素
pid_list = list(filter(lambda x: x!='',pid_l))
print (pid_list)
if len(pid_list)==0:
#如果端口没占用,则直接返回
return 0
if pid_list[-1]!='0':
#进程号不为0,则表示为有效的进程,我们停掉它
print(pid_list)
os.popen("taskkill /f /pid {}".format(pid_list[-1]))
def appium_start(host,port):
"""
host:地址
port:端口
"""
cmd = "start /b appium -a {} -p {} -bp {}".format(host,port,port+1)
#用subprocess运行命令行命令,上述命令 /b 参数,不会打开命令行窗口
subprocess.Popen(cmd,shell=True,stdout=open('./appium_log_'+str(port)+'.log','a'),stderr=subprocess.STDOUT)
def IsStart(url1,timeout):
"""
判断appium server是否启动成功
params:
url:appium server 的地址
timeout:等待的时间
"""
start_time = time.time()
end_time = start_time
print("url=",url1)
while True:
try:
#访问appium server的http地址
lib_response = urllib.request.urlopen(url1)
if lib_response.getcode() == 200:
print ("响应状态码是",lib_response.getcode())
lib_response.close()
return True
else:
print ("响应状态码是",lib_response.getcode())
time.sleep(3)
lib_response.close()
if time.time() - start_time >= timeout:
return False
except:
#当地址无效时会抛异常,所以一定要用try
time.sleep(3)
print(url1+"无法连接")
if time.time() - start_time >= timeout:
print("连接失败.....")
return False
if __name__ == '__main__':
host = '127.0.0.1'
port = 4738
#启动前如果端口被占用,就先停掉此进程
kill_process(port)
#另外启动一个子进程来打开appium server
p = multiprocessing.Process(target=appium_start,kwargs ={"host": host,"port": port})
p.start()
p.join()
#判断是否启动成功
url = "http://{}:{}/wd/hub".format(host,port)
IsStart(url+"/status",30)
#关闭进程
kill_process(port)