scrollUntil
suspend fun scrollUntil(target: Selector, direction: Direction = Direction.DOWN, maxScrolls: Int = 20, distancePercent: Int = DEFAULT_GESTURE_PERCENT, timeout: Duration? = null): Element(source)
Client-side loop: checks whether target exists inside this container (descendant) and, while it does not, scrolls once, up to maxScrolls scrolls within timeout (default the device's wait timeout). Returns the target as a lazy element scoped to this container, so a later action cannot hit a duplicate elsewhere on screen; a container with first()/at() cannot be carried into a relation, and then the bare target is used.
Throws WaitTimeoutException when the target never appeared. The list may have scrolled by then. Every step is an ordinary command, so a failing step throws its own CommandException.