判断坐标是否位于黑控件区域逻辑问题
BirdLearn opened this issue · 13 comments
黑控件仍然被点击到问题
复现场景
使用 fastbot 进行自动化测试时,偶现点击到黑控件区域,导致不符合预期的行为。
- 使用 max.widget.black 配置如下
[{
"activity": "com.xegale.mobile.main.MainActivity",
"xpath": "//*[@resource-id='com.xeagle.mobile:id/sniff_default_iv']"
}, {
"activity": "com.xegale.mobile.main.MainActivity",
"xpath": "//*[@resource-id='com.xeagle.mobile:id/bottom_tab_layout']"
}]
在实际使用中发现,即使配置了黑控件区域,仍然偶现点击到黑控件区域。
问题分析
使用 uiautomatorviewer 工具,识别黑控件区域坐标为 [0,2160][1080,2259],即在该区域下的坐标应被判定为不可点击区域。
通过走查日志发现:Fastbot 有点击 (682.29974,2224.0) 的操作,该坐标位于黑控件区域内部。
- 分析 java 层日志
[Fastbot][2024-03-20 16:47:58.428] :Sending Touch (ACTION_DOWN): 0:(682.29974,2224.0)
[Fastbot][2024-03-20 16:47:58.436] Wait Event for 1000 milliseconds
[Fastbot][2024-03-20 16:47:59.443] :Sending Touch (ACTION_UP): 0:(682.29974,2224.0)
- 分析 native 层日志
03-20 16:47:58.381 I/[Fastbot](18011): action type: LONG_CLICK
03-20 16:47:58.382 I/[Fastbot](18011): rpc cost time: 173
03-20 16:47:58.382 I/[Fastbot](18011): check point [568, 982] is in black widgets
03-20 16:47:58.382 I/[Fastbot](18011): check point [716, 487] is in black widgets
03-20 16:47:58.383 I/[Fastbot](18011): check point [653, 172] is in black widgets
03-20 16:47:58.383 I/[Fastbot](18011): check point [300, 1900] is in black widgets
03-20 16:47:58.383 I/[Fastbot](18011): check point [1013, 415] is in black widgets
03-20 16:47:58.384 I/[Fastbot](18011): check point [208, 748] is in black widgets
03-20 16:47:58.384 I/[Fastbot](18011): check point [357, 451] is in black widgets
03-20 16:47:58.384 I/[Fastbot](18011): check point [632, 1117] is in black widgets
03-20 16:47:58.385 I/[Fastbot](18011): check point [230, 811] is in black widgets
03-20 16:47:58.385 I/[Fastbot](18011): check point [456, 1360] is in black widgets
03-20 16:47:58.385 I/[Fastbot](18011): check point [682, 2224] is in black widgets
03-20 16:47:58.387 I/[Fastbot](18011): event time:499
03-20 16:47:58.387 I/[Fastbot](18011): :Sending rotation degree=0, persist=false
03-20 16:47:57.696 I/WindowManager( 1624): navColorWin was set to default navbar color so should add SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR 8518
03-20 16:47:58.388 I/[SPMN] ( 1624): insert SYSTEM -- name = accelerometer_rotation, package = android, user = 0, value = 0
03-20 16:47:58.388 I/HwWindowManagerServiceEx( 1624): setLandAnimationInfo : false
03-20 16:47:58.390 I/WindowManager( 1624): navColorWin was set to default navbar color so should add SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR 8518
03-20 16:47:58.393 I/HwWindowManagerServiceEx( 1624): setLandAnimationInfo : false
03-20 16:47:58.397 I/WindowManager( 1624): navColorWin was set to default navbar color so should add SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR 8518
03-20 16:47:58.403 I/[SPMN] ( 1624): insert SYSTEM -- name = accelerometer_rotation, package = android, user = 0, value = 1
03-20 16:47:58.405 I/WindowManager( 1624): navColorWin was set to default navbar color so should add SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR 8518
03-20 16:47:58.407 I/HwWindowManagerServiceEx( 1624): setLandAnimationInfo : false
03-20 16:47:58.415 I/WindowManager( 1624): navColorWin was set to default navbar color so should add SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR 8518
03-20 16:47:58.420 I/HwWindowManagerServiceEx( 1624): setLandAnimationInfo : false
03-20 16:47:58.423 I/WindowManager( 1624): navColorWin was set to default navbar color so should add SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR 8518
03-20 16:47:58.429 I/[Fastbot](18011): :Sending Touch (ACTION_DOWN): 0:(682.29974,2224.0)
- 分析 java 层代码
private PointF shieldBlackRect(PointF p) {
// move to native: AiClient.checkPointIsShield
int retryTimes = 10;
PointF p1 = p;
do {
if (!AiClient.checkPointIsShield(this.currentActivity, p1)) {
break;
}
// re generate a point
Rect displayBounds = AndroidDevice.getDisplayBounds();
float unitx = displayBounds.height() / 20.0f;
float unity = displayBounds.width() / 10.0f;
p1.x = p.x + retryTimes * unitx * RandomHelper.nextInt(8);
p1.y = p.y + retryTimes * unity * RandomHelper.nextInt(17);
p1.x = p1.x % displayBounds.width();
p1.y = p1.y % displayBounds.height();
} while (retryTimes-- > 0);
return p1;
}
- 测试出错原因
check point [456, 1360] is in black widgets 黑控件区域判断出错,导致一直识别为黑控件区域,耗尽重试次数后,偶现点击到黑控件区域
- native 层判断是否命中黑控件区域逻辑,该函数代码位于 /native/events/Preference.cpp 文件 335 行
bool Preference::checkPointIsInBlackRects(const std::string &activity, int pointX, int pointY) {
bool isInsideBlackList;
auto iter = this->_cachedBlackWidgetRects.find(activity);
isInsideBlackList = iter != this->_cachedBlackWidgetRects.end();
if (isInsideBlackList) {
const Point p(pointX, pointY);
for (const auto &rect: iter->second) {
if (rect->contains(p)) {
isInsideBlackList = true;
break;
}
}
}
BLOG("check point [%d, %d] is %s in black widgets", pointX, pointY,
isInsideBlackList ? "" : "not");
return isInsideBlackList;
}
- 逻辑分析
这段代码的目的是检查给定的点 (pointX, pointY) 是否位于与活动(activity)相关联的黑色矩形列表中的某个矩形内部。代码存在一个逻辑错误:
在检查点是否在黑色矩形内部时,如果 iter 存在(即 activity 对应黑控件存在),则将 isInsideBlackList 设置为 true,这是不对的,因为这只能做为是否应该在黑控件区域内部的判断条件,而不是结果。在遍历黑色矩形列表时,如果找到一个包含点的矩形,则将 isInsideBlackList 再次设置为 true,但是由于 isInsideBlackList 为true ,当遍历完所有的区域,isInsideBlackList 仍然为 true,此时实际结果应该是 false。即当前的坐标不存在于当前activity中的任何黑控件中。
实际上,当前版本的代码,在这种情况下,仍然做了true的判定,会导致即使遍历完所有的屏幕分区,仍然无法找到一个不存在于黑控件区域的坐标,然后耗尽重试次数,导致最终点击的坐标不可控。
解决方案
为了修复这个问题,我们可以在找到一个包含点的矩形后立即返回 true,而不是继续遍历其他矩形。如果没有找到包含点的矩形,则最终返回 false。
- 正确逻辑应该如下
bool Preference::checkPointIsInBlackRects(const std::string &activity, int pointX, int pointY) {
bool isInsideBlackList = false;
auto iter = this->_cachedBlackWidgetRects.find(activity);
if (iter != this->_cachedBlackWidgetRects.end()) {
const Point p(pointX, pointY);
for (const auto &rect : iter->second) {
if (rect->contains(p)) {
isInsideBlackList = true;
break; // Found, no need to continue checking
}
}
}
BLOG("check point [%d, %d] is %s in black widgets", pointX, pointY,
isInsideBlackList ? "" : "not");
return isInsideBlackList;
}
- 基于master 代码修改后的代码打出的so包验证该问题未再复现
有需要现成 so 包的同学,可以自取 https://github.com/BirdLearn/fastboot_fix_libs
修改上述提到的问题后,仍然有发现黑控件不生效的情况,通过走查日志发现另一个可能的代码逻辑问题。
在日志中看到配置中的多个 black widget,在 native 层日志均有打印识别到,但是在运行到实际判断 point 是否位于黑控件区域时,却打印 Rects: 1 ,即当前Activity中仅保存有一个黑控件区域,这与配置中的多个黑控件不符,因此导致黑控件不生效。
- 通过走查代码发现,在处理黑控件时逻辑如下
void Preference::resolveBlackWidgets(const ElementPtr &rootXML, const std::string &activity) {
// black widgets
if (!this->_blackWidgetActions.empty()) {
for (const CustomActionPtr &blackWidgetAction: this->_blackWidgetActions) {
if (!activity.empty() && blackWidgetAction->activity != activity)
continue;
XpathPtr xpath = blackWidgetAction->xpath;
// read the bounds of black widget from the config
std::vector<float> bounds = blackWidgetAction->bounds;
bool hasBoundingBox = bounds.size() >= 4;
if (nullptr == this->_rootScreenSize) {
BLOGE("black widget match failed %s", "No root node in current page");
return;
}
if (hasBoundingBox && bounds[1] <= 1.1 && bounds[3] <= 1.1) {
int rootWidth = this->_rootScreenSize->right;// - rootSize->left;
int rootHeight = this->_rootScreenSize->bottom;// - rootSize->top;
bounds[0] = bounds[0] * static_cast<float>(rootWidth);
bounds[1] = bounds[1] * static_cast<float>(rootHeight);
bounds[2] = bounds[2] * static_cast<float>(rootWidth);
bounds[3] = bounds[3] * static_cast<float>(rootHeight);
}
bool xpathExistsInPage;
std::vector<ElementPtr> xpathElements;
if (xpath) {
this->findMatchedElements(xpathElements, xpath, rootXML);
BDLOG("find black widget %s %d", xpath->toString().c_str(),
(int) xpathElements.size());
}
xpathExistsInPage = xpath && !xpathElements.empty();
std::vector<RectPtr> cachedRects; // cache black widgets
if (xpathExistsInPage && !hasBoundingBox) {
BLOG("black widget xpath %s, has no bounds matched %d nodes",
xpath->toString().c_str(), (int) xpathElements.size());
for (const auto &matchedElement: xpathElements) {
BLOG("black widget, delete node: %s depends xpath",
matchedElement->getResourceID().c_str());
cachedRects.push_back(matchedElement->getBounds());
matchedElement->deleteElement();
}
}
else if (xpathExistsInPage || (!xpath && hasBoundingBox)) {
RectPtr rejectRect = std::make_shared<Rect>(bounds[0], bounds[1], bounds[2],
bounds[3]);
cachedRects.push_back(rejectRect);
std::vector<ElementPtr> elementsInRejectRect;
rootXML->recursiveElements([&rejectRect](const ElementPtr &child) -> bool {
return rejectRect->contains(child->getBounds()->center());
}, elementsInRejectRect);
BLOG("black widget xpath %s, with bounds matched %d nodes",
xpath ? xpath->toString().c_str() : "none",
(int) elementsInRejectRect.size());
for (const auto &elementInRejectRect: elementsInRejectRect) {
if (elementInRejectRect) {
BLOG("black widget, delete node: %s depends xpath",
elementInRejectRect->getResourceID().c_str());
elementInRejectRect->deleteElement();
}
}
}
this->_cachedBlackWidgetRects[activity] = cachedRects;
}
}
}
以上代码中,在 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;
}
}
能力有限,无法肯定该问题定位是否准确,并且修改有效,劳烦项目管理员百忙之后可以抽时间审查一下,万分感谢
你好,后面这部分修改 是否已存在于你第一个问题提供的 so包链接中?
@BirdLearn 忍不住给大佬点赞。大佬有遇到过配置的自定义事件不生效的情况吗?
@BirdLearn 忍不住给大佬点赞。大佬有遇到过配置的自定义事件不生效的情况吗?
自定义事件如果是原生安卓应该还好,我这边配了很多,基本使用都正常。 这块比较考验你们对前端UI的分析,我们配的时候也不是一次就搞定,得反复调试几次, 一般都是 activity 不对或者 元素选错,得确认要操作的元素是否支持对应的能力,比如click,write。
你好,后面这部分修改 是否已存在于你第一个问题提供的 so包链接中?
fork了一份代码,并且把修改的代码和库文件都更新上去了,可以看一下这个仓库中的lib库文件,https://github.com/BirdLearn/Fastbot_Android/tree/main/libs
@BirdLearn 忍不住给大佬点赞。大佬有遇到过配置的自定义事件不生效的情况吗?
这个Fastbot 内部有很多隐含的逻辑在里面,并且文档中并没有详细说明,在调试的时候,需要可能需要结合日志与代码一起来分析为何action不生效,上面的同学回复的经验可以参考
另外:这里说一个隐含的规则,就是如何你的action中的控件是一个可输入的控件,例如输入框之类的话,默认fastbot 会根据规则随机或者在定义的字符串列表中去做输入,如果你需要在输入框控件上进行 keyevent 输入的话,就没法实现,我最新的代码和库文件中对这个逻辑进行了修改,新增 editable 字段进行默认输入控制,如果 editable 设置为 false的话,就不会有随机输入行为
以下是个例子
[{
"prob": 0.2,
"activity": "com.xxxxx.mobile.main.MainActivity",
"times": 1000000,
"actions": [{
"xpath": "//*[@resource-id='com.xxxxx.mobile:id/input_edit']",
"action": "CLICK",
"index": 0,
"throttle": 1000,
"editable": false
},
{
"xpath": "//*[@resource-id='com.xxxxx.mobile:id/search_really_edit']",
"action": "CLICK",
"index": 0,
"throttle": 3000,
"editable": true,
"text": "",
"clearText": true,
"useAdbInput": true
},
{
"xpath": "//*[@resource-id='com.xxxxx.mobile:id/search_really_edit']",
"action": "SHELL_EVENT",
"command": "input keyevent 66",
"editable": false
}]
}
]
@BirdLearn 忍不住给大佬点赞。大佬有遇到过配置的自定义事件不生效的情况吗?
这个Fastbot 内部有很多隐含的逻辑在里面,并且文档中并没有详细说明,在调试的时候,需要可能需要结合日志与代码一起来分析为何action不生效,上面的同学回复的经验可以参考
另外:这里说一个隐含的规则,就是如何你的action中的控件是一个可输入的控件,例如输入框之类的话,默认fastbot 会根据规则随机或者在定义的字符串列表中去做输入,如果你需要在输入框控件上进行 keyevent 输入的话,就没法实现,我最新的代码和库文件中对这个逻辑进行了修改,新增 editable 字段进行默认输入控制,如果 editable 设置为 false的话,就不会有随机输入行为
以下是个例子
[{ "prob": 0.2, "activity": "com.xxxxx.mobile.main.MainActivity", "times": 1000000, "actions": [{ "xpath": "//*[@resource-id='com.xxxxx.mobile:id/input_edit']", "action": "CLICK", "index": 0, "throttle": 1000, "editable": false }, { "xpath": "//*[@resource-id='com.xxxxx.mobile:id/search_really_edit']", "action": "CLICK", "index": 0, "throttle": 3000, "editable": true, "text": "", "clearText": true, "useAdbInput": true }, { "xpath": "//*[@resource-id='com.xxxxx.mobile:id/search_really_edit']", "action": "SHELL_EVENT", "command": "input keyevent 66", "editable": false }] } ]
输入控件,我这边业务有那种text的,password的。 还有那种密码不是一个空栏,是6个小方块的。都可以正常输入,需要安装并配置好 ADBkeyboard 。
从我使用的经验分析,他原本的逻辑好像是切换activity后 先判断自定义事件命中没有,如果命中了就会按顺序执行完自定义事件。没命中就会执行随机事件。 因为APP测试过程中会有意外登出,这时需要登录回来;金融APP还可能会触发APP锁屏页需要解锁。反正如果配置自定义事件没有弄错,都是生效的,不需要修改原有逻辑,你这么改感觉有风险,而且不好懂,"editable": false的情况反而可以输入,有点反人类。
另外有个特点,貌似没有id的元素好像它找不到,他的XPATH不能按照传统的xpath去理解。
大佬有没有QQ,加一下,交流点信息。关于覆盖率的。
@BirdLearn 忍不住给大佬点赞。大佬有遇到过配置的自定义事件不生效的情况吗?
这个Fastbot 内部有很多隐含的逻辑在里面,并且文档中并没有详细说明,在调试的时候,需要可能需要结合日志与代码一起来分析为何action不生效,上面的同学回复的经验可以参考
另外:这里说一个隐含的规则,就是如何你的action中的控件是一个可输入的控件,例如输入框之类的话,默认fastbot 会根据规则随机或者在定义的字符串列表中去做输入,如果你需要在输入框控件上进行 keyevent 输入的话,就没法实现,我最新的代码和库文件中对这个逻辑进行了修改,新增 editable 字段进行默认输入控制,如果 editable 设置为 false的话,就不会有随机输入行为
以下是个例子[{ "prob": 0.2, "activity": "com.xxxxx.mobile.main.MainActivity", "times": 1000000, "actions": [{ "xpath": "//*[@resource-id='com.xxxxx.mobile:id/input_edit']", "action": "CLICK", "index": 0, "throttle": 1000, "editable": false }, { "xpath": "//*[@resource-id='com.xxxxx.mobile:id/search_really_edit']", "action": "CLICK", "index": 0, "throttle": 3000, "editable": true, "text": "", "clearText": true, "useAdbInput": true }, { "xpath": "//*[@resource-id='com.xxxxx.mobile:id/search_really_edit']", "action": "SHELL_EVENT", "command": "input keyevent 66", "editable": false }] } ]
输入控件,我这边业务有那种text的,password的。 还有那种密码不是一个空栏,是6个小方块的。都可以正常输入,需要安装并配置好 ADBkeyboard 。 从我使用的经验分析,他原本的逻辑好像是切换activity后 先判断自定义事件命中没有,如果命中了就会按顺序执行完自定义事件。没命中就会执行随机事件。 因为APP测试过程中会有意外登出,这时需要登录回来;金融APP还可能会触发APP锁屏页需要解锁。反正如果配置自定义事件没有弄错,都是生效的,不需要修改原有逻辑,你这么改感觉有风险,而且不好懂,"editable": false的情况反而可以输入,有点反人类。 另外有个特点,貌似没有id的元素好像它找不到,他的XPATH不能按照传统的xpath去理解。
大佬有没有QQ,加一下,交流点信息。关于覆盖率的。
这个XPATH不是所有的布局信息中的控件元素都能找到,内部做了一层过滤,只有是可点击和客输入的控件才能查找到,你在执行的时候可以指定 -v -v -v 查看详细的 debug 日志,会有过滤后的布局文件信息输出
@BirdLearn 忍不住给大佬点赞。大佬有遇到过配置的自定义事件不生效的情况吗?
自定义事件如果是原生安卓应该还好,我这边配了很多,基本使用都正常。 这块比较考验你们对前端UI的分析,我们配的时候也不是一次就搞定,得反复调试几次, 一般都是 activity 不对或者 元素选错,得确认要操作的元素是否支持对应的能力,比如click,write。
@BirdLearn @liuts933 你们好,看到你们的回复很惊喜,毕竟这里已经很久没有人互动了。最近我也一直在研究为啥自定义的事件没有被执行,并且从日志上看完全没有痕迹,很感谢你们的回复。我这边情况是这样的,我算是fastbot很早的使用者了,从之前的maxin开始。之前也成功用它们做过一些项目的稳定性测试,包括自定义事件,都是没问题的。只是之前的项目都是native的,这次的项目是rn的,整个app只有一个壳子,里面的页面都是rn。对前端UI找元素这块,按之前的经验应该算是比较熟练了,目前使用的appium inspector工具找的元素,包括对我要操作的元素clickable等属性都进行了核对,但是跑起来,日志里还是没看到自定义事件相关的打印。想问下你,你们之前没写对的时候,日志里有打印自定义事件相关的日志吗?如果是元素的xpath写错了这个好解决,我现在遇到的最大问题是日志里没有一点自定义事件的痕迹
PATH不能按照传统的xpath去
@BirdLearn 忍不住给大佬点赞。大佬有遇到过配置的自定义事件不生效的情况吗?
这个Fastbot 内部有很多隐含的逻辑在里面,并且文档中并没有详细说明,在调试的时候,需要可能需要结合日志与代码一起来分析为何action不生效,上面的同学回复的经验可以参考
另外:这里说一个隐含的规则,就是如何你的action中的控件是一个可输入的控件,例如输入框之类的话,默认fastbot 会根据规则随机或者在定义的字符串列表中去做输入,如果你需要在输入框控件上进行 keyevent 输入的话,就没法实现,我最新的代码和库文件中对这个逻辑进行了修改,新增 editable 字段进行默认输入控制,如果 editable 设置为 false的话,就不会有随机输入行为
以下是个例子[{ "prob": 0.2, "activity": "com.xxxxx.mobile.main.MainActivity", "times": 1000000, "actions": [{ "xpath": "//*[@resource-id='com.xxxxx.mobile:id/input_edit']", "action": "CLICK", "index": 0, "throttle": 1000, "editable": false }, { "xpath": "//*[@resource-id='com.xxxxx.mobile:id/search_really_edit']", "action": "CLICK", "index": 0, "throttle": 3000, "editable": true, "text": "", "clearText": true, "useAdbInput": true }, { "xpath": "//*[@resource-id='com.xxxxx.mobile:id/search_really_edit']", "action": "SHELL_EVENT", "command": "input keyevent 66", "editable": false }] } ]
输入控件,我这边业务有那种text的,password的。 还有那种密码不是一个空栏,是6个小方块的。都可以正常输入,需要安装并配置好 ADBkeyboard 。 从我使用的经验分析,他原本的逻辑好像是切换activity后 先判断自定义事件命中没有,如果命中了就会按顺序执行完自定义事件。没命中就会执行随机事件。 因为APP测试过程中会有意外登出,这时需要登录回来;金融APP还可能会触发APP锁屏页需要解锁。反正如果配置自定义事件没有弄错,都是生效的,不需要修改原有逻辑,你这么改感觉有风险,而且不好懂,"editable": false的情况反而可以输入,有点反人类。 另外有个特点,貌似没有id的元素好像它找不到,他的XPATH不能按照传统的xpath去理解。
大佬有没有QQ,加一下,交流点信息。关于覆盖率的。这个XPATH不是所有的布局信息中的控件元素都能找到,内部做了一层过滤,只有是可点击和客输入的控件才能查找到,你在执行的时候可以指定 -v -v -v 查看详细的 debug 日志,会有过滤后的布局文件信息输出
看了大佬们的回复,收获很多。我的自定义元素就没有ID。我先按大佬们提供的方式先试者看看
][2024-09-19 19:36:21.665] // - NOT USING main activity com.android.settings.Settings$StorageUseActivity (from package com.android.settings)
[Fastbot][2024-09-19 19:36:21.665] // - NOT USING main activity com.sec.android.app.launcher.activities.LauncherActivity (from package com.sec.android.app.launcher)
[Fastbot][2024-09-19 19:36:21.666] // - NOT USING main activity com.google.android.googlequicksearchbox.SearchActivity (from package com.google.android.googlequicksearchbox)
[Fastbot][2024-09-19 19:36:21.666] // - NOT USING main activity com.samsung.android.video.player.activity.MonkeyTestActivity (from package com.samsung.android.video)
[Fastbot][2024-09-19 19:36:24.667] // phone info: samsung_SM-A536E_14
[Fastbot][2024-09-19 19:36:24.667] // runing fastbot
[Fastbot][2024-09-19 19:36:24.679] InputMethod ID: com.samsung.android.honeyboard/.service.HoneyBoardService
[Fastbot][2024-09-19 19:36:24.680] InputMethod ID: com.google.android.tts/com.google.android.apps.speech.tts.googletts.settings.asr.voiceime.VoiceInputMethodService
[Fastbot][2024-09-19 19:36:24.686] // device serial number is R5CT43QQFQZ
[Fastbot][2024-09-19 19:36:24.724] // device uuid is 681ee3d6-6bc7-42e9-ab76-39b11c7065ed
[Fastbot][2024-09-19 19:36:27.290] // init with reuse agent
[Fastbot][2024-09-19 19:36:27.337] fastbot native : library load!
[Fastbot][2024-09-19 19:36:27.339] fastbot native path is : /data/local/tmp/arm64-v8a/libfastbot_native.so
[Fastbot][2024-09-19 19:36:27.374]
[Fastbot]*** ERROR *** findMethod() error, NoSuchMethodException happened, there is no such method: getTasks
[Fastbot][2024-09-19 19:36:27.380] // current activity is com.pionex.MainActivity
[Fastbot][2024-09-19 19:36:27.391] // Event id: 1
[Fastbot][2024-09-19 19:36:28.060] action type: CLICK
[Fastbot][2024-09-19 19:36:28.061] rpc cost time: 70
[Fastbot][2024-09-19 19:36:28.067] Input text is 我的账户
[Fastbot][2024-09-19 19:36:28.069] MonkeyIMEEvent added 我的账户
[Fastbot][2024-09-19 19:36:28.073] event time:692
[Fastbot][2024-09-19 19:36:28.074] :Sending rotation degree=0, persist=false
[Fastbot][2024-09-19 19:36:28.099] :Sending Touch (ACTION_DOWN): 0:(482.0,2374.0)
[Fastbot][2024-09-19 19:36:28.111] :Sending Touch (ACTION_UP): 0:(482.0,2374.0)
[Fastbot][2024-09-19 19:36:28.203] minputshown=false
[Fastbot][2024-09-19 19:36:28.432] mInputShown not found, getInputMethodWindowVisibleHeight is used.
[Fastbot][2024-09-19 19:36:28.435] :Is accepting text: false
[Fastbot][2024-09-19 19:36:28.681] minputshown=false
[Fastbot][2024-09-19 19:36:28.853] mInputShown not found, getInputMethodWindowVisibleHeight is used.
[Fastbot][2024-09-19 19:36:28.876] :Is accepting text: false
[Fastbot][2024-09-19 19:36:29.138] minputshown=false
[Fastbot][2024-09-19 19:36:29.296] mInputShown not found, getInputMethodWindowVisibleHeight is used.
[Fastbot][2024-09-19 19:36:29.299] :Is accepting text: false
[Fastbot][2024-09-19 19:36:29.546] minputshown=false
[Fastbot][2024-09-19 19:36:29.743] mInputShown not found, getInputMethodWindowVisibleHeight is used.
[Fastbot][2024-09-19 19:36:29.755] :Is accepting text: false
[Fastbot][2024-09-19 19:36:30.018] minputshown=false
@BirdLearn 大佬,试了用3个- v运行,日志如上,还是没有看到有打印元素相关的信息。记得之前很早的maxin,如果操作某个元素,是有打印元素信息的,现在我这运行啥也没有,看起来比较迷茫。
][2024-09-19 19:36:21.665] // - NOT USING main activity com.android.settings.Settings$StorageUseActivity (from package com.android.settings) [Fastbot][2024-09-19 19:36:21.665] // - NOT USING main activity com.sec.android.app.launcher.activities.LauncherActivity (from package com.sec.android.app.launcher) [Fastbot][2024-09-19 19:36:21.666] // - NOT USING main activity com.google.android.googlequicksearchbox.SearchActivity (from package com.google.android.googlequicksearchbox) [Fastbot][2024-09-19 19:36:21.666] // - NOT USING main activity com.samsung.android.video.player.activity.MonkeyTestActivity (from package com.samsung.android.video) [Fastbot][2024-09-19 19:36:24.667] // phone info: samsung_SM-A536E_14 [Fastbot][2024-09-19 19:36:24.667] // runing fastbot [Fastbot][2024-09-19 19:36:24.679] InputMethod ID: com.samsung.android.honeyboard/.service.HoneyBoardService [Fastbot][2024-09-19 19:36:24.680] InputMethod ID: com.google.android.tts/com.google.android.apps.speech.tts.googletts.settings.asr.voiceime.VoiceInputMethodService [Fastbot][2024-09-19 19:36:24.686] // device serial number is R5CT43QQFQZ [Fastbot][2024-09-19 19:36:24.724] // device uuid is 681ee3d6-6bc7-42e9-ab76-39b11c7065ed [Fastbot][2024-09-19 19:36:27.290] // init with reuse agent [Fastbot][2024-09-19 19:36:27.337] fastbot native : library load! [Fastbot][2024-09-19 19:36:27.339] fastbot native path is : /data/local/tmp/arm64-v8a/libfastbot_native.so [Fastbot][2024-09-19 19:36:27.374]
[Fastbot]*** ERROR *** findMethod() error, NoSuchMethodException happened, there is no such method: getTasks [Fastbot][2024-09-19 19:36:27.380] // current activity is com.pionex.MainActivity [Fastbot][2024-09-19 19:36:27.391] // Event id: 1 [Fastbot][2024-09-19 19:36:28.060] action type: CLICK [Fastbot][2024-09-19 19:36:28.061] rpc cost time: 70 [Fastbot][2024-09-19 19:36:28.067] Input text is 我的账户 [Fastbot][2024-09-19 19:36:28.069] MonkeyIMEEvent added 我的账户 [Fastbot][2024-09-19 19:36:28.073] event time:692 [Fastbot][2024-09-19 19:36:28.074] :Sending rotation degree=0, persist=false [Fastbot][2024-09-19 19:36:28.099] :Sending Touch (ACTION_DOWN): 0:(482.0,2374.0) [Fastbot][2024-09-19 19:36:28.111] :Sending Touch (ACTION_UP): 0:(482.0,2374.0) [Fastbot][2024-09-19 19:36:28.203] minputshown=false [Fastbot][2024-09-19 19:36:28.432] mInputShown not found, getInputMethodWindowVisibleHeight is used. [Fastbot][2024-09-19 19:36:28.435] :Is accepting text: false [Fastbot][2024-09-19 19:36:28.681] minputshown=false [Fastbot][2024-09-19 19:36:28.853] mInputShown not found, getInputMethodWindowVisibleHeight is used. [Fastbot][2024-09-19 19:36:28.876] :Is accepting text: false [Fastbot][2024-09-19 19:36:29.138] minputshown=false [Fastbot][2024-09-19 19:36:29.296] mInputShown not found, getInputMethodWindowVisibleHeight is used. [Fastbot][2024-09-19 19:36:29.299] :Is accepting text: false [Fastbot][2024-09-19 19:36:29.546] minputshown=false [Fastbot][2024-09-19 19:36:29.743] mInputShown not found, getInputMethodWindowVisibleHeight is used. [Fastbot][2024-09-19 19:36:29.755] :Is accepting text: false [Fastbot][2024-09-19 19:36:30.018] minputshown=false @BirdLearn 大佬,试了用3个- v运行,日志如上,还是没有看到有打印元素相关的信息。记得之前很早的maxin,如果操作某个元素,是有打印元素信息的,现在我这运行啥也没有,看起来比较迷茫。
不好意思,我记错了,不是三个-v, 是 4 个 -v
adb shell CLASSPATH=/sdcard/monkeyq.jar:/sdcard/framework.jar:/sdcard/fastbot-thirdpart.jar exec app_process /system/bin com.android.commands.monkey.Monkey -p com.xxx.xxx --agent reuseq --running-minutes 30 --throttle 1000 -v -v -v -v > logs.log
你调试的时候,结合adb shell 的monkey日志 和 手机端的logcat 日志一起去看,有些日志是在logcat里面的,顺着日志捋一下逻辑,基本都能搞得定
][2024-09-19 19:36:21.665] // - NOT USING main activity com.android.settings.Settings$StorageUseActivity (from package com.android.settings) [Fastbot][2024-09-19 19:36:21.665] // - NOT USING main activity com.sec.android.app.launcher.activities.LauncherActivity (from package com.sec.android.app.launcher) [Fastbot][2024-09-19 19:36:21.666] // - NOT USING main activity com.google.android.googlequicksearchbox.SearchActivity (from package com.google.android.googlequicksearchbox) [Fastbot][2024-09-19 19:36:21.666] // - NOT USING main activity com.samsung.android.video.player.activity.MonkeyTestActivity (from package com.samsung.android.video) [Fastbot][2024-09-19 19:36:24.667] // phone info: samsung_SM-A536E_14 [Fastbot][2024-09-19 19:36:24.667] // runing fastbot [Fastbot][2024-09-19 19:36:24.679] InputMethod ID: com.samsung.android.honeyboard/.service.HoneyBoardService [Fastbot][2024-09-19 19:36:24.680] InputMethod ID: com.google.android.tts/com.google.android.apps.speech.tts.googletts.settings.asr.voiceime.VoiceInputMethodService [Fastbot][2024-09-19 19:36:24.686] // device serial number is R5CT43QQFQZ [Fastbot][2024-09-19 19:36:24.724] // device uuid is 681ee3d6-6bc7-42e9-ab76-39b11c7065ed [Fastbot][2024-09-19 19:36:27.290] // init with reuse agent [Fastbot][2024-09-19 19:36:27.337] fastbot native : library load! [Fastbot][2024-09-19 19:36:27.339] fastbot native path is : /data/local/tmp/arm64-v8a/libfastbot_native.so [Fastbot][2024-09-19 19:36:27.374]
[Fastbot]*** ERROR *** findMethod() error, NoSuchMethodException happened, there is no such method: getTasks [Fastbot][2024-09-19 19:36:27.380] // current activity is com.pionex.MainActivity [Fastbot][2024-09-19 19:36:27.391] // Event id: 1 [Fastbot][2024-09-19 19:36:28.060] action type: CLICK [Fastbot][2024-09-19 19:36:28.061] rpc cost time: 70 [Fastbot][2024-09-19 19:36:28.067] Input text is 我的账户 [Fastbot][2024-09-19 19:36:28.069] MonkeyIMEEvent added 我的账户 [Fastbot][2024-09-19 19:36:28.073] event time:692 [Fastbot][2024-09-19 19:36:28.074] :Sending rotation degree=0, persist=false [Fastbot][2024-09-19 19:36:28.099] :Sending Touch (ACTION_DOWN): 0:(482.0,2374.0) [Fastbot][2024-09-19 19:36:28.111] :Sending Touch (ACTION_UP): 0:(482.0,2374.0) [Fastbot][2024-09-19 19:36:28.203] minputshown=false [Fastbot][2024-09-19 19:36:28.432] mInputShown not found, getInputMethodWindowVisibleHeight is used. [Fastbot][2024-09-19 19:36:28.435] :Is accepting text: false [Fastbot][2024-09-19 19:36:28.681] minputshown=false [Fastbot][2024-09-19 19:36:28.853] mInputShown not found, getInputMethodWindowVisibleHeight is used. [Fastbot][2024-09-19 19:36:28.876] :Is accepting text: false [Fastbot][2024-09-19 19:36:29.138] minputshown=false [Fastbot][2024-09-19 19:36:29.296] mInputShown not found, getInputMethodWindowVisibleHeight is used. [Fastbot][2024-09-19 19:36:29.299] :Is accepting text: false [Fastbot][2024-09-19 19:36:29.546] minputshown=false [Fastbot][2024-09-19 19:36:29.743] mInputShown not found, getInputMethodWindowVisibleHeight is used. [Fastbot][2024-09-19 19:36:29.755] :Is accepting text: false [Fastbot][2024-09-19 19:36:30.018] minputshown=false @BirdLearn 大佬,试了用3个- v运行,日志如上,还是没有看到有打印元素相关的信息。记得之前很早的maxin,如果操作某个元素,是有打印元素信息的,现在我这运行啥也没有,看起来比较迷茫。不好意思,我记错了,不是三个-v, 是 4 个 -v
adb shell CLASSPATH=/sdcard/monkeyq.jar:/sdcard/framework.jar:/sdcard/fastbot-thirdpart.jar exec app_process /system/bin com.android.commands.monkey.Monkey -p com.xxx.xxx --agent reuseq --running-minutes 30 --throttle 1000 -v -v -v -v > logs.log
你调试的时候,结合adb shell 的monkey日志 和 手机端的logcat 日志一起去看,有些日志是在logcat里面的,顺着日志捋一下逻辑,基本都能搞得定
感谢大佬的指点,看了跑出来的元素信息,确实是有些view被过滤了,而剩下的那些并不在我的配置里,找到问题的原因了