diff --git a/uitest/core/ui_model.cpp b/uitest/core/ui_model.cpp index 2588f28..8ce27b0 100644 --- a/uitest/core/ui_model.cpp +++ b/uitest/core/ui_model.cpp @@ -311,7 +311,8 @@ namespace OHOS::uitest { widgetsConstructed_ = true; } - static void DfsMarshalWidget(const WidgetTree& tree, const Widget& root, nlohmann::json& dom) + static void DfsMarshalWidget(const WidgetTree& tree, const Widget& root, nlohmann::json& dom, + const std::map widgetChildCountMap) { auto attributesData = json(); // "< UiAttr::HIERARCHY" : do not expose inner used attributes @@ -326,14 +327,21 @@ namespace OHOS::uitest { attributesData[ATTR_NAMES[UiAttr::BOUNDS].data()] = stream.str(); auto childrenData = json::array(); - uint32_t childIndex = 0; - auto child = tree.GetChildWidget(root, childIndex); - while (child != nullptr) { - auto childData = json(); - DfsMarshalWidget(tree, *child, childData); - childrenData.emplace_back(childData); + uint32_t childIndex = 0, childCount = 0, visitCount = 0; + auto hierarchy = root.GetHierarchy(); + if (widgetChildCountMap.find(hierarchy) != widgetChildCountMap.end()) { + childCount = widgetChildCountMap.find(hierarchy)->second; + } + while (visitCount < childCount) { + auto child = tree.GetChildWidget(root, childIndex); childIndex++; - child = tree.GetChildWidget(root, childIndex); + if (child == nullptr) { + continue; + } + auto childData = json(); + DfsMarshalWidget(tree, *child, childData, widgetChildCountMap); + childrenData.emplace_back(childData); + visitCount++; } dom["attributes"] = attributesData; @@ -344,8 +352,20 @@ namespace OHOS::uitest { { DCHECK(widgetsConstructed_); auto root = GetRootWidget(); + std::map widgetChildCountMap; + for (auto &hierarchy : widgetHierarchyIdDfsOrder_) { + if (hierarchy == ROOT_HIERARCHY) { + continue; + } + auto parentHierarchy = WidgetHierarchyBuilder::GetParentWidgetHierarchy(hierarchy); + if (widgetChildCountMap.find(parentHierarchy) == widgetChildCountMap.end()) { + widgetChildCountMap[parentHierarchy] = 1; + } else { + widgetChildCountMap[parentHierarchy] = widgetChildCountMap[parentHierarchy] + 1; + } + } if (root != nullptr) { - DfsMarshalWidget(*this, *root, dom); + DfsMarshalWidget(*this, *root, dom, widgetChildCountMap); } } diff --git a/uitest/server/system_ui_controller.cpp b/uitest/server/system_ui_controller.cpp index a95b03d..b2c5fc1 100644 --- a/uitest/server/system_ui_controller.cpp +++ b/uitest/server/system_ui_controller.cpp @@ -210,6 +210,7 @@ namespace OHOS::uitest { child = child2; } if (!child.IsVisible()) { + LOG_I("invisible node drop, id: %{public}d", child.GetAccessibilityId()); continue; } auto parcel = json();