bytedance / Fastbot_Android

Fastbot(2.0) is a model-based testing tool for modeling GUI transitions to discover app stability problems
Other
1.01k stars 235 forks source link

判断坐标是否位于黑控件区域逻辑问题 #275

Open BirdLearn opened 3 months ago

BirdLearn commented 3 months ago

黑控件仍然被点击到问题

复现场景

使用 fastbot 进行自动化测试时,偶现点击到黑控件区域,导致不符合预期的行为。

在实际使用中发现,即使配置了黑控件区域,仍然偶现点击到黑控件区域。

问题分析

使用 uiautomatorviewer 工具,识别黑控件区域坐标为 [0,2160][1080,2259],即在该区域下的坐标应被判定为不可点击区域。 通过走查日志发现:Fastbot 有点击 (682.29974,2224.0) 的操作,该坐标位于黑控件区域内部。

解决方案

为了修复这个问题,我们可以在找到一个包含点的矩形后立即返回 true,而不是继续遍历其他矩形。如果没有找到包含点的矩形,则最终返回 false。

BirdLearn commented 3 months ago

修改上述提到的问题后,仍然有发现黑控件不生效的情况,通过走查日志发现另一个可能的代码逻辑问题。

在日志中看到配置中的多个 black widget,在 native 层日志均有打印识别到,但是在运行到实际判断 point 是否位于黑控件区域时,却打印 Rects: 1 ,即当前Activity中仅保存有一个黑控件区域,这与配置中的多个黑控件不符,因此导致黑控件不生效。

以上代码中,在 for 循环内定义了一个变量 std::vector<float> bounds = blackWidgetAction->bounds;,并在当前for 循环结束时,将识别到的cachedRects 赋值给 _cachedBlackWidgetRects Map 中的 activity 对应的值,这样导致在循环结束后,只有最后一个黑控件的区域被保存在 _cachedBlackWidgetRects 中,因此导致黑控件不生效。

解决方案

修改 resolveBlackWidgets 函数,将 cachedRects 定义在 for 在 for 循环外部,这样在循环结束后,所有的黑控件区域都会被保存在 _cachedBlackWidgetRects 中,代码如下

    void Preference::resolveBlackWidgets(const ElementPtr &rootXML, const std::string &activity) {
        // black widgets
        if (!this->_blackWidgetActions.empty()) {
            std::vector<RectPtr> cachedRects;  // cache black widgets
            for (const CustomActionPtr &blackWidgetAction: this->_blackWidgetActions) {
                // ... ...
            }
            this->_cachedBlackWidgetRects[activity] = cachedRects;
        }
    }

能力有限,无法肯定该问题定位是否准确,并且修改有效,劳烦项目管理员百忙之后可以抽时间审查一下,万分感谢