移动端APP自动化平台搭建,我们在执行完case后,需要在后置处理器函数做清理,比如清理chromedriver和appium进程,完整代码放在文章最后。
下面开始:
清理chromedriver
linux下杀appium进程
都比较简单
主要是windows下杀appium进程,可能会有比较多同学踩坑,所以在这分享下windows杀进程的方案给用windows写代码的同学,保证靠谱,不靠谱可以评论找我!
下面的代码是通过端口号找到进程,
plist = subprocess.getstatusoutput("netstat -ano|findstr %s" % cls.aport)[1].split("\n")
getstatusoutput方法返回的是指令执行的结果和输出,数据结构是一个元组,比如执行成功就是这样(‘0’,‘控制台输出xxxxx’)
这里可能找到多个进程,所以我们要对结果plist进行处理,按换行符作为分隔符把结果切成列表,列表的每一个元素是结果中的一条记录,plist的数据是这样的
[
' TCP 0.0.0.0:9904 0.0.0.0:0 LISTENING 58740',
' TCP 127.0.0.1:1120 127.0.0.1:9904 ESTABLISHED 58172',
' TCP 127.0.0.1:9904 127.0.0.1:1120 ESTABLISHED 58740',
' UDP 127.0.0.1:49900 *:* 6612',
' UDP 127.0.0.1:49901 *:* 6168',
' UDP 127.0.0.1:49902 *:* 6168'
]
要注意一个端口号会有多个进程(父进程、子进程),我们杀进程的时候要找出来进程ID最大的来杀掉,就是这一段代码
```python
r = []
for pinfo in plist:
r.append(pinfo.split()[-1])
pid = max(r)
找到进程号后这里还有坑,你可能会下面跟着直接一行杀进程的代码就结束了,然后就会发现pid总是取到0,然后系统提示你进程号0是系统进程,不能杀。
所以我写了个while循环去扫描进程,扫到了就杀掉,否则一直扫!
windows下通过端口号找进程杀进程完整代码
```python
@classmethod
def tearDownClass(cls) -> None:
# 退出chromedriver
cls.driver.quit()
time.sleep(30)
# 杀掉appium server进程
# linux
# subprocess.Popen('lsof -n -i :%s |grep LISTEN |awk "{print $2}" |xargs kill' % port, shell=True)
# windows
# 获取appium pid
plist = subprocess.getstatusoutput("netstat -ano|findstr %s" % cls.aport)[1].split("\n")
r = []
for pinfo in plist:
r.append(pinfo.split()[-1])
pid = max(r)
# 杀appium进程
while 1:
print(f"扫描appium进程ID {pid}...")
if pid:
print(f"扫描到appium进程ID: {pid}, 执行命令 taskkill /PID {pid} /F 杀掉进程!")
subprocess.Popen("taskkill /PID %s /F" % pid, shell=True)
break
print("----t1脚本执行结束----")
执行结果