feat(driver): add TapSelector and make mock WaitForIdle honor duration

Real maestro driver will resolve selectors itself rather than
forcing the runner to look up coordinates from the hierarchy. Mock
now waits the requested duration so tests don't busy-spin and
starve the SDK fixture goroutine.
This commit is contained in:
pj committed 2026-04-17 23:54:00 +07:00
1 parent abeded0b19
commit d2fae427f9
2 files changed
+22 -1

No files matched your search

+21 -1
View File
@@ -14,6 +14,7 @@ const (
ActionLaunch ActionKind = "launch"
ActionTerminate ActionKind = "terminate"
ActionTap ActionKind = "tap"
ActionTapSelector ActionKind = "tap_selector"
ActionInputText ActionKind = "input_text"
ActionHierarchy ActionKind = "hierarchy"
ActionScreenshot ActionKind = "screenshot"
@@ -26,6 +27,7 @@ type Action struct {
BundleID string
ClearState bool
X, Y int
Selector string
Text string
Idle time.Duration
}
@@ -98,6 +100,14 @@ func (d *Driver) Tap(ctx context.Context, x, y int) error {
return nil
}
func (d *Driver) TapSelector(ctx context.Context, selector string) error {
if err := d.failure(ActionTapSelector); err != nil {
return err
}
d.record(Action{Kind: ActionTapSelector, Selector: selector})
return nil
}
func (d *Driver) InputText(ctx context.Context, text string) error {
if err := d.failure(ActionInputText); err != nil {
return err
@@ -131,7 +141,17 @@ func (d *Driver) WaitForIdle(ctx context.Context, duration time.Duration) error
return err
}
d.record(Action{Kind: ActionWaitForIdle, Idle: duration})
return nil
if duration <= 0 {
return nil
}
timer := time.NewTimer(duration)
defer timer.Stop()
select {
case <-ctx.Done():
return ctx.Err()
case <-timer.C:
return nil
}
}
func (d *Driver) Health(ctx context.Context) (driver.Health, error) {