Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 45 additions & 3 deletions server/lib/src/utils/element_helper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,27 @@ class ElementHelper {
static Future<Finder> findElement(Finder by, {String? contextId}) async {
List<Finder> 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<Finder> elementList) {
for (Finder element in elementList) {
try {
if (element.hitTestable().tryEvaluate()) {
return element;
}
} catch (_) {}
}
return null;
}

static Future<List<Finder>> findElements(Finder by,
{String? contextId, bool evaluatePresence = false}) async {
Finder finder = by;
Expand All @@ -42,7 +59,6 @@ class ElementHelper {

finder = find.descendant(of: parent.by, matching: by);
}
finder = finder.hitTestable();
final FinderResult<Element> elements = finder.evaluate();
if (evaluatePresence) {
await waitForElementExist(FlutterElement.fromBy(finder),
Expand All @@ -57,11 +73,37 @@ class ElementHelper {

List<Finder> 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<void> click(FlutterElement element) async {
WidgetTester tester = _getTester();
await tester.tap(element.by);
Expand Down