高级特性¶
QT4A中有部分功能是不常需要用到的,不过特定场景下可以使用的,列举如下。
禁止窗口弹出¶
有的应用,会不定期弹出特定窗口(是应用定义的窗口,不是系统弹窗),这些时机无法把握,也就无法在用例中特定时机进行处理。这个时候,如果该窗口不是我们的测试点,可以在项目App类屏蔽该窗口弹出:
class DemoApp(AndroidApp):
def __init__(self, device=None, clear_state=True, kill_process=True, net_type='wifi', start_extra_params={}):
import time
super(DemoApp, self).__init__(self.process_dict['Main'], device)
#other operation
self._start(clear_state, kill_process, start_extra_params=start_extra_params)
def _start(self, clear_state=True, kill_process=True, start_extra_params={}):
'''启动Android demo apk
'''
# 启动Activity的相关代码,此处省略,详细见Demo样例
#接下来新增禁止窗口弹出逻辑
self.set_demo_ads_activtiy_popup()
def set_demo_ads_activtiy_popup(self, popup=False):
'''设置广告页面是否可以弹出
'''
self.set_activity_popup('com.xx.xxActivity', popup) #第一个参数是Activity名
假设在应用中,不定期会弹出广告窗口,可以按上面调用set_activity_popup接口禁止弹出,由于Demo App实际没有什么广告窗口,所以这里随意指定了个Activity名。
该接口并不是任何场景都能用的,
- 如果你要禁止的Activity,有不同的窗口页面对应,那么你会把其他正常需要弹出的页面也屏蔽掉,所以需要这个Activity只对应了广告这个窗口,才可使用。
- 这个接口不能作用于非App内页面,如一些系统弹框等,该接口不适用。
- 并不是App类任意页面都可以随意禁用掉,如果页面间有关联,有可能影响其他功能逻辑,所以请根据实际,需要且可用时才使用该功能。
监控任务¶
如果在应用中,不定期会弹出一些窗口,且这类窗口你希望禁用掉,但由于该窗口与其他你不希望禁用掉的窗口有相同的Activity名,所以不能直接按上面禁止窗口弹出的方法处理,此时你可以建个监控任务,监控到需要点掉的窗口,再去处理:
class DemoApp(AndroidApp):
def __init__(self, device=None, clear_state=True, kill_process=True, net_type='wifi', start_extra_params={}):
import time
super(DemoApp, self).__init__(self.process_dict['Main'], device)
#other operation
self._start(clear_state, kill_process, start_extra_params=start_extra_params)
def _start(self, clear_state=True, kill_process=True, start_extra_params={}):
'''启动Android demo apk
'''
# 启动Activity的相关代码,此处省略,详细见Demo样例
#接下来新增应用启动后检测无用窗口
self.add_monitor_task(self.detect_invalid_activity)
def detect_invalid_activity(self):
'''检测不想要弹出的窗口
'''
current_activity = self.device.get_current_activity()
if current_activity == 'xx.xx.upgradeActivity':
self.send_back_key()
elif current_activity == 'xx.xx.adviseActivity':
#定义该面板,并点击面板中的例如关闭按钮关闭页面。例如:
# advise_panel = AdvisePanel(self)
#if advise_panel.Controls['关闭推荐'].exist():
#advise_panel.Controls['关闭推荐'].click()
pass
#……
如上,调用AndroidApp类提供的add_monitor_task接口,可以启动监控线程监控不期望弹出的窗口。当有监控线程监控的窗口弹出时,可以例如判断该窗口是否有特定按钮存在,如果有,就是需要关闭的窗口,可以点击关闭按钮关闭,如果没有,这个窗口就不是该监控线程需要处理的。当你需要停止监控时,可以调用AndroidApp类的stop_monitor接口停止监控。
注解
监控线程监控是有时延的,因为其是每间隔一段时间才去判断一次是否有窗口需要处理,所以只有在窗口不定期弹出需要处理掉才使用监控线程的方式。
系统授权弹窗¶
在Android6.0及以上系统,发现即使root过的机型,也还是无法关闭系统授权弹框,此时可以尝试调用如下接口grant_all_runtime_permissions:
class DemoApp(AndroidApp):
def __init__(self, device=None, clear_state=True, kill_process=True, net_type='wifi', start_extra_params={}):
import time
super(DemoApp, self).__init__(self.process_dict['Main'], device)
#other operation
self._start(clear_state, kill_process, start_extra_params=start_extra_params)
self.grant_all_runtime_permissions()
调用该接口且生效的话,用例执行过程中就不再会弹出授权提示框,使用例可以正常执行完成。当然,该接口不适用于非root机型。非root机型的系统弹框需要再自行关闭。