Appium自动化测试获取和设置安卓设备网络状态

背景

最近有个需求,就是在自动化测试之前,先获取设备的网络状态,以客观的方式展现出来。有人就要说了,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或数据未开启,网络未连接")

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值