APP自动化测试(9)-代码启动appium server

目录

一、安装命令行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自动化测试(9)-代码启动appium server_第1张图片

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

一、安装命令行appium

1.1、安装node.js

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

1.2、安装cnpm

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

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

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

如下图

APP自动化测试(9)-代码启动appium server_第2张图片

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

 [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自动化测试(9)-代码启动appium server_第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、命令行启动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)
    

你可能感兴趣的:(APP自动化测试,appuim,python,npm)