在测试过程中难免需要有一些跟网络状态相关的设置,比如要确保‘wifi‘是连接的,或者确保‘数据网络‘是连接的,或者是没网络的.有问题先翻查API,翻查之后发现appium也灰常给力的提供了相关的API,将尝试过程中的一些问题总结一下.
好嘞,客官,菜来喽!!!
1.set_network_connection(self, connectionType)Sets the network connection type. Android only.
Possible values:
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
These are available through the enumeration `appium.webdriver.ConnectionType`
:Args:
- connectionType - a member of the enum appium.webdriver.ConnectionType
这个API的大概意思是:设置网络连接类型,通过`appium.webdriver.ConnectionType`枚举类型设置.
0=无/1=飞行模式/2=wifi/4=数据/6=所有网络
先不管那个什么枚举类型了,直接上API+参数开跑代码,实践出真理!首先试一下‘6‘,看看这个‘所有网络‘都包括什么~
我手机现在的状态是这样的:
都是关闭的状态
执行代码:
driver.set_network_connection(6)
结果:
额~~所好的所有网络,只开启一个wifi````````````
接着就是‘4‘数据,应该就是指手机卡的网络开关,我们设置一下来验证.
执行代码:
driver.set_network_connection(4)
结果:
这是什么鬼````你好歹开启点啥啊```居然还是没反应?
再来试试‘2‘wifi连接
执行代码:
driver.set_network_connection(2)
结果:
这是正常的```
接下来是飞行模式
执行代码:
driver.set_network_connection(1)
结果:
这也是正常的```
最后是‘0‘代表无连接,那我就先把各种连接都打开好了:
执行代码:
driver.set_network_connection(0)
结果:
合着"数据"连接,就是体系外的了,执行"0无连接",关闭的也只是wifi`````````
轮流试过一遍了,我又想去纠结一下,这个`appium.webdriver.ConnectionType`,于是我就去这个地方看了看:
跟API写的差不都一个意思,我搜索了一下,于是乎发现了另一个使用方法如下:
from appium.webdriver.connectiontype import ConnectionType
driver.set_network_connection(ConnectionType.AIRPLANE_MODE)
又臭又长的写法,不知道能不能打开数据网络呢?去试试~
执行代码:
driver.set_network_connection(ConnectionType.DATA_ONLY)
结果:然而并没什么软用``````````````好吧,能开一个wifi我就满足了.
在实际测试的时候,没跑一条用例就执行一次打开wifi是挺烦的,于是乎我考虑自己组装一个方法,先查看一下网络状态,如果wifi没开,我在打开wifi连接.有这个想法后,我又去翻了api,还真有获取当前网络的方法.
2.network_connection
Returns an integer bitmask specifying the network connection type.
Android only.
Possible values are available through the enumeration `appium.webdriver.ConnectionType`
这个API的大概意思:返回网络连接类型的整数
我手机现在的状态是这样的:
执行代码:
print(driver.network_connection)
结果:0
鉴于刚才,打开"数据"网络无效,所以我想试试,如果我开启数据网络,获取到的信息是什么样:
执行代码:
print(driver.network_connection)
结果:4
"纳尼"(*?∀?)`````正确返回4了!!真是匪夷所思的体验``
刚刚我们执行"6所有网络"的时候,仅开启了wifi,这回试试仅开启wifi返回的是什么:
执行代码:
print(driver.network_connection)
结果:2
"纳尼"(*?∀?)`````正确返回2了!!!好吧,看来查询状态的API,比设置状态的API靠谱很多.
我以为这样我就可以拿去用了,然后还有坑,我的测试机,是没有手机卡的,于是乎我遇到了坑.
测试机的状态是这样的:
没有手机卡,"数据"不可点击状态,颜色稍微特别一点.
执行代码:
print(driver.network_connection)
结果:4
"纳尼"(*?∀?)`````怎么是4呢?我连手机卡都没有啊!!!!,假如把wifi也开启,岂不是返回6了??
我们来试试:
执行代码:
print(driver.network_connection)
结果:6
"纳尼"(*?∀?)`````还真是6啊!6啊!6啊!服了`````跪拜~
实际用这两个组合的时候还是要多试一下,我发现的坑没准仅针对我自己的这几台测试机而已.仅供参考~~
3.启动蓝牙
appium并没有启动蓝牙的API,搜索了一下相关问题发现了两个解决方案:
第一方案:适用于代码能力好的大牛,思路超简单,就是重构appium的API,增加启动蓝牙的功能......#大神们应该也不用看我废话
第二方案:用python的自带库(subprocess),执行adb am命令,启动蓝牙
在执行adb am命令的时候,会弹出一个询问打开蓝牙的对话框,是可以直接点击的,如图:
‘允许‘有唯一的ID,可以直接点击
好吧,不废话了,直接上代码.
手机目前的状态:
执行代码:
subprocess.call("adb shell am start -a android.bluetooth.adapter.action.REQUEST_ENABLE",shell=True)
driver.find_element_by_id("android:id/button1").click() #这是点击‘允许‘
结果:
蓝牙开启成功
对于那串adb命令不理解的,大家去搜‘adb am‘命令学习一下好了,理论上通过‘adb am‘命令还能开启更多appium没法完成的设置
菜齐了!