赞
踩
目录
1.3、安装appium,注意cmd命令行窗口要用管理员运行,否则会安装失败
前面我们已经安装了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
如下图
继续运行命令安装,还是有错误,如下
- appium-uiautomator2-driver@1.75.0 › 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)
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。