背景
最近有个需求,就是在自动化测试之前,先获取设备的网络状态,以客观的方式展现出来。有人就要说了,Appium不是自带有方法可以获取嘛。确实,使用官方的方法简单便捷,但是也有一个缺点,比如同时开启飞行模式和wifi的时候,结果还是1,但是此时是有网络的,与实际网络情况不符。
+--------------------+------+------+---------------+
| Value (Alias) | Data | Wifi | Airplane Mode |
+====================+======+======+===============+
| 0 (None) | 0 | 0 | 0 |
+--------------------+------+------+---------------+
| 1 (Airplane Mode) | 0 | 0 | 1 |
+--------------------+------+------+---------------+
| 2 (Wifi only) | 0 | 1 | 0 |
+--------------------+------+------+---------------+
| 4 (Data only) | 1 | 0 | 0 |
+--------------------+------+------+---------------+
| 6 (All network on) | 1 | 1 | 0 |
+--------------------+------+------+---------------+
# 获取当前网络关启状态
driver.network_connection # 返回数字 1:飞行模式 2:只开wifi 4:只开流量 6:网络全开
# 设置网络网络关启状态
driver.set_network_connection(ConnectionType.AIRPLANE_MODE) # 设置网络网络关启状态为飞行模式,导入ConnectionType包后,代码可读性增强,推荐
思路
已知global中可以获取到各个开关的状态,那么根据网络开关,wifi开关,飞行模式开关的状态,就可以自己实现类似Appium获取网络状态一样的效果,而且更加准确。
代码实现
def get_adb_value(self, code):
"""
:param code: 给出adb命令
:return: 以string方式返回adb命令得到的值
"""
print("\n" + code)
devices_cmd = os.popen(code, "r")
value = devices_cmd.read().strip() # 返回的值有换行,所以用strip去掉
return value
def get_network_status(self):
"""
| 流量 | wifi |飞行模式 | 结果
| 0 | 0 | 0 | 0
| 0 | 0 | 1 | 1
| 0 | 1 | 0 | 2
| 0 | 2 | 1 | 3
| 1 | 0 | 0 | 4
| 1 | 0 | 0 | 6
:return: 获取网络状态 返回数字 0:什么都没开 1:飞行模式 2:只开wifi 3:开飞行模式&开wifi 4:只开流量 6:网络全开
"""
data_state = self.get_adb_value("adb shell settings get global mobile_data1")
data_status = data_state if data_state != "null" else "0" # 坑,没插卡的时候,mobile_data1为null
wifi_state = self.get_adb_value("adb shell settings get global wifi_on")
wifi_status = wifi_state if wifi_state != "2" else "1" # 坑,同时开启wifi和飞行模式,wifi_on结果为2
fly_status = self.get_adb_value("adb shell settings get global airplane_mode_on")
return int(data_status + wifi_status + fly_status, 2)
def getNetworkResult(self):
"""
:return: 是否ping通
"""
shell = 'adb shell ping -c 1 www.baidu.com'
# 获取结果
result = os.popen(shell)
for line in result.readlines():
if 'ms' in line:
return True
return False
def test_001(self, wait=None):
# network_type = self.driver.network_connection # 对于某些设备失效
network_type = self.get_network_status()
match network_type:
case 0:
print("没开网络")
case 1:
print("开启了飞行模式")
case 2:
print("开启了wifi")
case 3:
print("开启了飞行模式和wifi")
case 4:
print("开启流量")
case 6:
print("流量和wifi都有开启")
if network_type > 1:
if self.getNetworkResult():
print("网络状态良好")
else:
print("网络已开启,但是连不上网")
else:
print("wifi或数据未开启,网络未连接")