Advanced: Wikipedia Android

A complete example using Maestro + Wikipedia App

Content

  • Go through onboarding
  • Navigate dashboard
    • Scroll feed & search for item
    • Copy text & paste
    • Validate visible items
  • Authentication
    • Signup
    • Login
  • Use javascript
Use maestro download-samples to download the app and code

Onboarding

  1. 1.
    Launches app in clear state
  2. 2.
    Runs onboarding flow
    1. 1.
      Add language
    2. 2.
      Remove language
    3. 3.
      Complete onboarding
# run-test.yml
appId: org.wikipedia
---
- launchApp:
clearState: true
- runFlow: "onboarding/main.yml"
main.yml
add-language.yml
remove-language.yml
# onboarding/onboarding.yml
appId: org.wikipedia
---
- runFlow: "add-language.yml"
- runFlow: "remove-language.yml"
- tapOn: "Continue"
- assertVisible: "New ways to explore"
- tapOn: "Continue"
- assertVisible: "Reading lists with sync"
- tapOn: "Continue"
- assertVisible: "Send anonymous data"
- tapOn: "Get started"
# onboarding/add-language.yml
appId: org.wikipedia
---
- tapOn: "ADD OR EDIT.*"
- tapOn: "ADD LANGUAGE"
- tapOn:
id: ".*menu_search_language"
- inputText: "Greek"
- assertVisible: "Ελληνικά"
- tapOn: "Ελληνικά"
- tapOn: "Back"
# onboarding/remove-language.yml
appId: org.wikipedia
---
- tapOn: "ADD OR EDIT.*"
- tapOn: "More options"
- tapOn: "Remove language"
- tapOn:
id: ".*wiki_language_checkbox"
index: 1
- tapOn:
id: ".*menu_delete_selected"
- tapOn: "OK"
- assertNotVisible: "Ελληνικά"
- tapOn: "Back"
maestro test run-test.yml
  1. 1.
    Search & Save
    1. 1.
      Searches for a wiki page
    2. 2.
      Saves the wiki page in favorites
    3. 3.
      Returns to main dashboard
  2. 2.
    Feed
    1. 1.
      Scroll feed until it finds a particular article
    2. 2.
      Opens article
  3. 3.
    Copy & Paste
    1. 1.
      Scrolls feed until it finds a particular article
    2. 2.
      Copies article title
    3. 3.
      Pastes copied text into another field
  4. 4.
    Saved
    1. 1.
      Vaidates a particular page has been saved in our favorites
# run-test.yml
appId: org.wikipedia
- launchApp
---
- runFlow: "dashboard/search.yml"
- runFlow: "dashboard/feed.yml"
- runFlow: "dashboard/copy-paste.yml"
- runFlow: "dashboard/saved.yml"
search.yml
feed.yml
copy-paste.yml
saved.yml
appId: org.wikimedia
---
- tapOn: "Search Wikipedia"
- inputText: "Sun"
- assertVisible: "Star in the Solar System"
- tapOn:
id: ".*page_list_item_title"
- tapOn:
id: ".*page_save"
- back
- back
appId: org.wikimedia
---
- tapOn: "Explore"
- scrollUntilVisible:
element: "Today on Wikipedia.*"
- tapOn: "Today on Wikipedia.*"
- back
appId: org.wikimedia
---
- tapOn: "Explore"
- scrollUntilVisible:
element: "Top read"
- copyTextFrom:
id: ".*view_list_card_item_title"
index: 0
- tapOn: "Explore"
- tapOn: "Search Wikipedia"
- inputText: "${maestro.copiedText}"
- back
- back
appId: org.wikimedia
---
- tapOn: "Saved"
- tapOn: "Default list for your saved articles"
- assertVisible: "Sun"
- assertVisible: "Star in the Solar System"
- back
maestro test run-test.yml

Authentication

  1. 1.
    Signup
    1. 1.
      Navigates to signup
    2. 2.
      Generates credentials using javascript
    3. 3.
      Fills input fields with generated credentials
  2. 2.
    Login
    1. 1.
      Navigates to login
    2. 2.
      Fetches a test user from a test api using javascript
    3. 3.
      Fill input fields with fetched credentials
# run-test.yml
appId: org.wikipedia
- launchApp
---
- runFlow: "auth/signup.yml"
- runFlow: "auth/login.yml"
login.yml
signup.yml
appId: org.wikimedia
---
- tapOn: "More"
- tapOn: "LOG IN.*"
- tapOn:
id: ".*create_account_login_button"
- runScript: "fetchTestUser.js"
- tapOn: "Username"
- inputText: "${output.test_user.username}"
- tapOn: "Password"
- inputText: "test-password"
- tapOn: "LOG IN"
# we won't actually login
- back
- back
appId: org.wikimedia
---
- tapOn: "More"
- tapOn: "LOG IN.*"
- runScript: "generateCredentials.js"
- tapOn: "Username"
- inputText: "${output.credentials.username}"
- tapOn: "Password"
- inputText: "${output.credentials.password}"
- tapOn: "Repeat password"
- inputText: "${output.credentials.password}"
- tapOn: "Email.*"
- inputText: "${output.credentials.email}"
# We won't actually create the account
- back
- back

Javascript scripts

generateCredentials.js
fetchTestUser.js
function username() {
const date = new Date().getTime().toString();
return `test_user_${date}`;
}
function email() {
const date = new Date().getTime().toString();
return `test-user-${date}@test.com`;
}
function password() {
const date = new Date().getTime().toString();
return `test-user-password-${date}`;
}
output.credentials = {
email: email(),
password: password(),
username: username(),
};
// Fetches test user from API
function getTestUserFromApi() {
const url = `https://jsonplaceholder.typicode.com/users/1`;
const response = http.get(url);
const data = json(response.body);
return {
username: data.username,
email: data.email,
};
}
output.test_user = getTestUserFromApi();
maestro test run-test.yml