appium--自动检测端口和释放端口

Posted 邹邹很busy。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了appium--自动检测端口和释放端口相关的知识,希望对你有一定的参考价值。

检测端口

当端口被其他服务占用时,如果我们还启动这个端口,则会报错,所以很有必要在使用这个端口时,先来检测一下这个端口有没有被其他服务使用。

端口检测需要用到socket模块来校验端口是否被占用

什么是socket?

网络上的两个程序通信,底层都是使用socket来实现的。socket的本质是编程接口,对TCP/IP的封装。

shutdown(flag) 禁止在 一个socket上进行数据的接收与发送,利用shutdown函数使socket双向数据传输变为单项数据传输, shutdown()需要一个单独的参数,该参数表示如果关闭socket

  • 0表示禁止以后读
  • 1表示禁止以后写
  • 2表示禁止以后读和写
import socket


def check_port(host, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.connect((host, port))
        s.shutdown(2)
    except OSError as e:
        print(\'端口没有被其他服务占用,可以使用\')
        print(e)
    else:
        print(\'端口被其他服务占用了\')


if __name__ == \'__main__\':
    check_port(host=\'127.0.0.1\', port=4723)  # port不能是字符串

当我们启动appium服务,并且端口是4723时,提示我们

端口被其他服务占用了

当端口没有被其他服务使用时提示

端口没有被其他服务占用,可以使用
[WinError 10061] 由于目标计算机积极拒绝,无法连接。

这时候我们就可以使用4723端口了

自动释放端口

前面我们说了关闭端口的两种方式,第一种是在资源管理器中关闭,第二种是使用命令关闭,不管是哪种方式,都需要我们手动去执行,对于做自动化的老司机来说,这肯定不行的,接下来让我们使用脚本来关闭

import os


# 释放端口
def release_port(port):
    # 执行命令
    cmd_find = \'netstat -aon | findstr %s\' % (port)
    print(\'cmd_find\', cmd_find)

    # 返回执行后的结果
    res = os.popen(cmd_find).read()
    print(\'res\', res)

    if str(port) and \'LISTENING\' in res:
        # 获取端口的pid
        i = res.index(\'LISTENING\') # LISTENTING的索引
        start = i + len(\'LISTENING\') + 7
        end = res.index(\'\\n\')
        pid = res[start:end]
        print(\'pid:\', pid)

        # 关闭被占用端口的pid
        cmd_kill = \'taskkill -f -pid %s\' % (pid)
        print(\'cmd_kill:\', cmd_kill)
        os.popen(cmd_kill)  # 关闭端口
    else:
        print(\'当前端口是可以使用的\')


if __name__ == \'__main__\':
    release_port(4727)

结果:

cmd_find netstat -aon | findstr 4727
res   TCP    0.0.0.0:4727           0.0.0.0:0              LISTENING       3056

pid: 3056
cmd_kill: taskkill -f -pid 3056

 

以上是关于appium--自动检测端口和释放端口的主要内容,如果未能解决你的问题,请参考以下文章

读懂appium原理,看这篇就够了

ADB server端口修改为10001,Appium无法连接设备

如何为子进程选择一个空闲端口?

appium自动化测试 电脑无线连接手机

C# socket超时释放端口

java中如何检测本机指定的UDP服务端口是不是被占用?并且自动分配一个可用udp端口;