缘由
如题,对于开发人员使用windowmanager自定义的toast消息,无法获取
解决思路
在小伙伴@erickyang 的提示下,我又去看了一下appium下ui2.0服务获取toast的源码
private class Listener extends Thread{
private long previousTime = currentTimeMillis();
public void run() {
while (true) {
AccessibilityEvent accessibilityEvent = null;
toastMessages = init();
//return true if the AccessibilityEvent type is NOTIFICATION type
UiAutomation.AccessibilityEventFilter eventFilter = new UiAutomation.AccessibilityEventFilter() {
@Override
public boolean accept(AccessibilityEvent event) {
return event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
}
};
Runnable runnable = new Runnable() {
@Override
public void run() {
// Not performing any event.
}
};
try {
//wait for AccessibilityEvent filter
accessibilityEvent = UiAutomatorBridge.getInstance().getUiAutomation()
.executeAndWaitForEvent(runnable /*executable event*/, eventFilter /* event to filter*/, 500 /*time out in ms*/);
} catch (Exception ignore) {}
if (accessibilityEvent != null) {
toastMessages = accessibilityEvent.getText();
previousTime = currentTimeMillis();
Logger.info("toastMessages getText:" + toastMessages);
GetToastMessage.toastMessage = toastMessages.toString();// add by chenlg
}
if (stopLooping) {
break;
}
}
}
public List<CharSequence> init(){
if (currentTimeMillis() - previousTime > TOAST_CLEAR_TIMEOUT) {
return new ArrayList<CharSequence>();
}
return toastMessages;
}
}
从这边可以看到是捕获的AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED事件,
然后和开发的同学沟通了一下,windowmanager在弹窗的时候,发送的是什么样的事件?是否可以捕获?
开发的同学说他们可以主动发这个事件AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED
主动发送事件的方法
AccessibilityEvent event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED);
event.getText().add("hellowindowManager");
view.onPopulateAccessibilityEvent(event);
view.sendAccessibilityEventUnchecked(event);
拓展
以后对于不能捕获的UI无素,可以试试这种方法,捕获相关的信息,方便做自动化测试
转载文章时务必注明原作者及原始链接,并注明「发表于 TesterHome 」,并不得对作品进行修改。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!