Running spotify_play against the real phone showed a tap can be delivered to the app and then never acted on (the dispatcher lists the Spotify window as the touch target, and the screen does not move). The run log also showed step durations were printed as 0s while the recorded ones were correct. - wait steps accept "retry N": on timeout, re-run the step above and wait again, up to N extra times. Only a wait may use it, it needs a step above it, and it can only press something already matched by text. spotify_play uses it on the search box and on the playback check. - The success log line printed the duration before the deferred assignment ran. It now records the duration first. - uiautomator dump starts a JVM on the phone, and the wait helpers polled every 400ms. ui.PollInterval is now 1500ms, which cuts that load on a phone that is already short of memory. docs/phase-3-spotify-recipe.md logs attempts 7-10: the recipe now reaches tap_row and picks "Honky Tonk Women" at (540,878), but the app stops acting on input on this loaded phone, so the end-to-end run is still outstanding.
76 lines
3.2 KiB
Plaintext
76 lines
3.2 KiB
Plaintext
# spotify_play — search Spotify for a song and play it.
|
|
#
|
|
# Edit this file by hand. Steps name the text Artemis must find on screen; it
|
|
# taps the centre of the element it matched. There are no coordinates here on
|
|
# purpose, so this recipe survives a Spotify redesign (FR-4).
|
|
#
|
|
# Run it with:
|
|
# artemis run spotify_play query="Rolling Stones Honky Tonk"
|
|
|
|
task: spotify_play
|
|
description: Search Spotify for a song and play it.
|
|
app: com.spotify.music
|
|
|
|
# The caller must supply these.
|
|
param: query
|
|
|
|
# Spotify's list rows: title + subtitle inside one clickable container. Naming
|
|
# the container keeps the tap on the row itself and off the row's buttons.
|
|
row_id: com.spotify.music:id/row_root
|
|
|
|
step_timeout: 20s
|
|
total_timeout: 420s
|
|
|
|
# Screens Artemis must never tap on. Each one fails the run with the reason, so
|
|
# a wrong tap is impossible (FR-8).
|
|
guard "Log in" => Spotify is signed out; sign in on the phone and retry
|
|
guard "Sign up free" => Spotify is signed out; sign in on the phone and retry
|
|
guard "Log in to Spotify" => Spotify is signed out; sign in on the phone and retry
|
|
guard "Continue with Facebook" => Spotify is showing its welcome screen; sign in on the phone and retry
|
|
guard "Continue with Google" => Spotify is showing its welcome screen; sign in on the phone and retry
|
|
guard "Update Spotify" => Spotify wants an update; update it on the phone and retry
|
|
guard "What's new" => Spotify is showing an announcement screen; dismiss it on the phone and retry
|
|
|
|
steps:
|
|
# 1. Make sure Spotify is up. Launching an app that is already open is a
|
|
# no-op, so this is safe to repeat.
|
|
- launch
|
|
- foreground 30s
|
|
- wait "Search" 30s retry 2
|
|
|
|
# 2. Open the search tab. Spotify remembers the last tab, so a search screen
|
|
# with the previous query can come back: clear that box only when the
|
|
# clear button is actually on screen.
|
|
- tap "Search"
|
|
- tap_if "Clear search query"
|
|
# retry: the clear tap above can be dropped while the phone is busy, so press
|
|
# it again before giving up on the empty search box.
|
|
- wait "What do you want to listen to?" 30s retry 3
|
|
- tap "What do you want to listen to?"
|
|
|
|
# 3. Type the query. The clear button proves the text landed.
|
|
- type "{query}"
|
|
- wait "Clear search query" 30s
|
|
|
|
# 4. Wait for the results to replace the "Recents" list, so the next step can
|
|
# never match something from the history instead of a search result.
|
|
- wait_gone "Recents" 30s
|
|
|
|
# 5. Give the app a moment. Spotify renders the results list after the query
|
|
# lands, and the tap below must land on the settled list.
|
|
- sleep 1s
|
|
|
|
# 6. Play the result that matches the query. tap_row scores every visible
|
|
# result row against the query words and taps the best one; equal matches
|
|
# go to the highest row, which is how Spotify ranks them.
|
|
- tap_row "{query}" 40s
|
|
|
|
# 7. Playback started when the transport button says "Pause". Exact match, so
|
|
# Spotify's "Paused" labels do not count.
|
|
#
|
|
# This is the phone's slowest moment: the app is rendering a new list and
|
|
# can stop answering input for a while, so a tap can be dropped. "retry 3"
|
|
# presses the row again and waits, up to three more times. It never taps
|
|
# anything it did not match by text.
|
|
- wait exact "Pause" 45s retry 3
|