当前位置:   article > 正文

APP自动化测试(9)-代码启动appium server_command failed with exit code 1: node install-npm.

command failed with exit code 1: node install-npm.js

目录

一、安装命令行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了。

研究了半天,总是启动失败,设置好环境变量后启动报这个错

后来研究发现是要安装一个命令行的版本,安装如下

一、安装命令行appium

1.1、安装node.js

    我们在APP自动化测试(1)-工具安装中已经讲过了,需要的进去看一下node.js安装

1.2、安装cnpm

  1. 1.命令行输入
  2. npm install -g cnpm --registry=https://registry.npm.taobao.org
  3. 2.安装完成后cnpm -v,显示版本号即可

1.3、安装appium,注意cmd命令行窗口要用管理员运行,否则会安装失败

  1. cmd 输入:cnpm install -g appium
  2. 安装完成后,输入appium即可启动
  3. 后面可通过命令行启动appium,并切制定端口和ip

安装报错,提示

  1. C:\Windows\system32>ERROR: Failed to set up Chromium r1095492! Set "PUPPETEER_SKIP_DOWNLOAD" env variable to skip download.
  2. 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

如下图

继续运行命令安装,还是有错误,如下

  1. appium-uiautomator2-driver@1.75.0 › appium-chromedriver@^4.23.1 postinstall, finished in 3s
  2. Install fail! Error: run postinstall error, please remove node_modules before retry!
  3. Command failed with exit code 1: node install-npm.js
  4. Error: Command failed with exit code 1: node install-npm.js
  5. at makeError (C:\Users\86181\AppData\Roaming\npm\node_modules\cnpm\node_modules\execa\lib\error.js:60:11)
  6. at handlePromise (C:\Users\86181\AppData\Roaming\npm\node_modules\cnpm\node_modules\execa\index.js:118:26)
  7. at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
  8. at async exports.runScript (C:\Users\86181\AppData\Roaming\npm\node_modules\cnpm\node_modules\npminstall\lib\utils.js:262:12)
  9. at async runLifecycleScripts (C:\Users\86181\AppData\Roaming\npm\node_modules\cnpm\node_modules\npminstall\lib\lifecycle_scripts.js:64:7)
  10. at async _install (C:\Users\86181\AppData\Roaming\npm\node_modules\cnpm\node_modules\npminstall\lib\install_package.js:318:5)
  11. at async install (C:\Users\86181\AppData\Roaming\npm\node_modules\cnpm\node_modules\npminstall\lib\install_package.js:23:12)
  12. at async mapper (C:\Users\86181\AppData\Roaming\npm\node_modules\cnpm\node_modules\npminstall\lib\install_package.js:270:9)
  13. npminstall version: 7.5.0
  14. 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
  15. **INFO** Skipping browser download as instructed

 运行appium还是无法成功,无奈之下通过npm安装,运行如下命令

  1. C:\Users\86181\AppData>npm install appium -g
  2. 下面是运行输出
  3. added 655 packages, changed 31 packages, and audited 687 packages in 29s
  4. 41 vulnerabilities (10 moderate, 18 high, 13 critical)
  5. To address issues that do not require attention, run:
  6. npm audit fix
  7. To address all issues possible (including breaking changes), run:
  8. npm audit fix --force
  9. Some issues need review, and may require choosing
  10. a different dependency.
  11. Run `npm audit` for details.

看起来没什么明显错误,运行appium命令试试,如下,安装成功1.22.3版本,是最新版本

二、代码启动命令行appium server

执行app自动化的前提工作,启动appium server,验证是否启动成功,启动成功后建立WebDriver对象。建立WebDriver对象我们在前面已经讲过了,直接把代码抄过来就行,这里主要讲启动appium server 和验证是否启动成功。

2.1启动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端口

2.2验证是否启动成功

appium server启动后会有一个http的服务,我们通过方法http://127.0.0.1:port/wd/hub/status地址,如果返回状态码是200则表示启动成功了。

2.3关闭appium server

服务启动成功用完后要关闭进程,否则下次启动会由于端口已经被占用而无法使用。

我们通过netstat -aon|findstr “port”找到对应的进程ID,如果进程ID不为0,表示该端口正在被监听,我们用 taskkill /f /pid pid 强制关掉

2.4代码

进行简单的函数封装

  1. '''
  2. 1、命令行启动appium server
  3. 2、判断是否启动成功
  4. 3、关闭启动的经常
  5. '''
  6. import subprocess
  7. import multiprocessing
  8. import time
  9. import urllib.request
  10. from urllib import request
  11. import os
  12. def kill_process(port):
  13. """
  14. 根据端口找到进程ID,然后关闭
  15. """
  16. #通过如下命令找到端口为port的所有进程信息
  17. #返回的是 TCP 127.0.0.1:4738 0.0.0.0:0 LISTENING 14520
  18. cmd = "netstat -aon|findstr "+str(port)
  19. p = os.popen(cmd)
  20. #取第一行数据,第一行为正在监听端口的进程信息
  21. pid_str = p.read().split("\n")[0]
  22. #用空格切分为列表
  23. pid_l =pid_str.split(" ")
  24. #删除为''的所有元素
  25. pid_list = list(filter(lambda x: x!='',pid_l))
  26. print (pid_list)
  27. if len(pid_list)==0:
  28. #如果端口没占用,则直接返回
  29. return 0
  30. if pid_list[-1]!='0':
  31. #进程号不为0,则表示为有效的进程,我们停掉它
  32. print(pid_list)
  33. os.popen("taskkill /f /pid {}".format(pid_list[-1]))
  34. def appium_start(host,port):
  35. """
  36. host:地址
  37. port:端口
  38. """
  39. cmd = "start /b appium -a {} -p {} -bp {}".format(host,port,port+1)
  40. #用subprocess运行命令行命令,上述命令 /b 参数,不会打开命令行窗口
  41. subprocess.Popen(cmd,shell=True,stdout=open('./appium_log_'+str(port)+'.log','a'),stderr=subprocess.STDOUT)
  42. def IsStart(url1,timeout):
  43. """
  44. 判断appium server是否启动成功
  45. params:
  46. url:appium server 的地址
  47. timeout:等待的时间
  48. """
  49. start_time = time.time()
  50. end_time = start_time
  51. print("url=",url1)
  52. while True:
  53. try:
  54. #访问appium server的http地址
  55. lib_response = urllib.request.urlopen(url1)
  56. if lib_response.getcode() == 200:
  57. print ("响应状态码是",lib_response.getcode())
  58. lib_response.close()
  59. return True
  60. else:
  61. print ("响应状态码是",lib_response.getcode())
  62. time.sleep(3)
  63. lib_response.close()
  64. if time.time() - start_time >= timeout:
  65. return False
  66. except:
  67. #当地址无效时会抛异常,所以一定要用try
  68. time.sleep(3)
  69. print(url1+"无法连接")
  70. if time.time() - start_time >= timeout:
  71. print("连接失败.....")
  72. return False
  73. if __name__ == '__main__':
  74. host = '127.0.0.1'
  75. port = 4738
  76. #启动前如果端口被占用,就先停掉此进程
  77. kill_process(port)
  78. #另外启动一个子进程来打开appium server
  79. p = multiprocessing.Process(target=appium_start,kwargs ={"host": host,"port": port})
  80. p.start()
  81. p.join()
  82. #判断是否启动成功
  83. url = "http://{}:{}/wd/hub".format(host,port)
  84. IsStart(url+"/status",30)
  85. #关闭进程
  86. kill_process(port)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/187015
推荐阅读
相关标签
  

闽ICP备14008679号