阅读本文大约需要1.1分钟。
背景
由于现在很多应用的页面数据都是AI算法推荐生成的,所以每次打开同一个页面数据都会不一样,因此在做客户端UI自动化的过程中都会采用Mock方案,利用MockServer来提供稳定的测试数据,其中MockServer的代理需要手动配置。
拿Android手机举例,过程大致是:进入设置->进入 WLAN ->找对应 wifi 连接->进入详情->找到代理->选择手动->输入主机名->输入端口号->最后保存,可以看到每次都是重复操作,特别当你的自动化设备很多以及MockServer服务不稳定导致IP经常变的情况下累加的时间成本是很高的,而且一不小心,还有可能写错
方案
今天给大家分享一下如何通过命令行动态设置Android手机的代理,其实如果只有一台手机,直接执行下面的命令行即可:
设置代理
adb shell settings put global http_proxy ip:port
清除代理
adb shell settings put global http_proxy :0
但是当宿主机挂载了多台设备的时候,就需要指定设备了,正常来说直接-s指定设备SN号即可,但是这里会有些问题,代理并不会生效,需要将原生的adb命令用pure-python-adb 这个Python库代替,这个是通过纯Python实现的ADB客户端,原理如下:
再通过Flask-Script把设置代理和清除代理封装成命令行工具,实现代码如下:
from flask_script import Manager
from ppadb.client import Client as AdbClient
@manager.option('-sn', '--sn', dest='sn', default='', help='设备sn号')
@manager.option('-proxy', '--proxy', dest='proxy', default='', help='代理地址加端口')
def set_proxy(sn, proxy):
try:
client = AdbClient(host="127.0.0.1", port=5037)
device = client.device(sn)
device.shell("settings put global http_proxy {0}".format(proxy))
LOGGER.debug("settings put global http_proxy {0}".format(proxy))
except Exception as e:
LOGGER.error(e)
@manager.option('-sn', '--sn', dest='sn', default='', help='设备sn号')
def clean_proxy(sn):
try:
client = AdbClient(host="127.0.0.1", port=5037)
device = client.device(sn)
device.shell("settings put global http_proxy :0")
LOGGER.debug("settings put global http_proxy :0")
except Exception as e:
LOGGER.error(e)
需要注意的是通过这种方式自动设置代理后WiFi高级选项中是看不到代理信息的而且无法取消,必须通过命令取消。