diff --git a/server/lib/src/utils/element_helper.dart b/server/lib/src/utils/element_helper.dart index 6cddc07..0f2afdc 100644 --- a/server/lib/src/utils/element_helper.dart +++ b/server/lib/src/utils/element_helper.dart @@ -26,10 +26,27 @@ class ElementHelper { static Future findElement(Finder by, {String? contextId}) async { List elementList = await findElements(by, contextId: contextId, evaluatePresence: true); - log("Element found ${elementList.first}"); + final Finder? hitTestableElement = + getFirstHitTestableElementIfPresent(elementList); + if (hitTestableElement != null) { + log("The hitTestable element found $hitTestableElement"); + return hitTestableElement; + } + log("The non-hitTestable element found ${elementList.first}"); return elementList.first; } + static Finder? getFirstHitTestableElementIfPresent(List elementList) { + for (Finder element in elementList) { + try { + if (element.hitTestable().tryEvaluate()) { + return element; + } + } catch (_) {} + } + return null; + } + static Future> findElements(Finder by, {String? contextId, bool evaluatePresence = false}) async { Finder finder = by; @@ -42,7 +59,6 @@ class ElementHelper { finder = find.descendant(of: parent.by, matching: by); } - finder = finder.hitTestable(); final FinderResult elements = finder.evaluate(); if (evaluatePresence) { await waitForElementExist(FlutterElement.fromBy(finder), @@ -57,11 +73,37 @@ class ElementHelper { List elementList = []; for (int i = 0; i < elements.length; i++) { - elementList.add(finder.at(i)); + if (isVisibleOnAppScreen(elements.elementAt(i))) { + elementList.add(finder.at(i)); + } } return elementList; } + static bool isVisibleOnAppScreen(Element finderElement) { + if (finderElement.renderObject is! RenderBox) { + return true; + } + final WidgetTester tester = _getTester(); + final widgetRect = + tester.getRect(find.byElementPredicate((e) => e == finderElement)); + + final allWidgets = tester.allWidgets.toList(); + + for (final widget in allWidgets) { + final elements = find.byWidget(widget).evaluate(); + for (final element in elements) { + if (element.renderObject is RenderBox) { + final rootRect = tester.getRect( + find.byElementPredicate((e) => e == element), + ); + return widgetRect.overlaps(rootRect); + } + } + } + return false; + } + static Future click(FlutterElement element) async { WidgetTester tester = _getTester(); await tester.tap(element.by);