Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Failure to scroll the screen using both scroll and scrollUntilVisible commands #2201

Open
1 task done
SomniumDigital opened this issue Dec 17, 2024 · 2 comments
Open
1 task done

Comments

@SomniumDigital
Copy link

SomniumDigital commented Dec 17, 2024

Is there an existing issue for this?

  • I have searched the existing issues and didn't find mine.

Steps to reproduce

Main test flow file
appId: ${APP_ID}
---
- clearState
- launchApp
- runFlow:
    label: Dismiss welcome sheet if visible
    when:
      visible: Welcome to the new Pets experience
    commands:
        - tapOn:
            id: action-sheet-header-close
- runFlow:
    label: Ava product flow
    file: productSearch.flow.yml
    env:
      BRAND_NAME: "Ava"
      CLOSE_ACTIONSHEET: true
- runFlow:
    label: "Wainwright's product flow"
    file: productSearch.flow.yml
    env:
      BRAND_NAME: "Wainwright's"
      CLOSE_ACTIONSHEET: true
- runFlow:
    label: [Co. Name] product flow
    file: productSearch.flow.yml
    env:
      BRAND_NAME: "[Co. Name]"
      CLOSE_ACTIONSHEET: false
- tapOn:
    label: Go to basket
    id: 'mini-basket-view-basket'
- tapOn:
    label: Select home delivery
    id: "basket-delivery-home-radio"
- runFlow:
    label: Remove out of stock items from the basket
    when:
      visible: An item in your basket is out of stock for delivery, please remove to continue.
    commands:
      - scrollUntilVisible:
          element: Out of stock
      - repeat:
          while:
            visible: "Out of stock"
          commands:
            - tapOn:
                id: "basket-item-remove-button"
- scrollUntilVisible:
    element: "Continue to checkout"
- tapOn: "Continue to checkout"
- tapOn:
    id: guest-email
- inputRandomEmail # Enters a random Email address
- pressKey: "enter"
- tapOn:
    above: Delivery
- tapOn: First name *
- inputText: John
- pressKey: 'enter'
- tapOn: Last name *
- inputText: Smith
- pressKey: 'enter'
- tapOn: Mobile number
- inputText: "07712345678"
- pressKey: 'enter'
- tapOn: Enter a postcode *
- inputText: "PE2 8TS"
- pressKey: 'enter'
- tapOn: 1 Rayner Avenue, Peterborough, PE2 8TS
- scrollUntilVisible:
    element: "Continue to payment"
- assertVisible: Delivery options
- tapOn: "Continue to payment"
- assertVisible: Choose a payment method
Product search test file
appId: ${APP_ID}
---
- tapOn:
    id: "header-search-bar"
- inputText: ${BRAND_NAME}
- pressKey: "enter"
- scroll
- copyTextFrom:
    label: Copy product name
    id: "product-name"
    index: 1
- evalScript:
    script: ${output.productName = maestro.copiedText}
    label: Retain copied product name
- scrollUntilVisible:
    centerElement: true
    element:
      id: "product-list-tile"
      index: 1
- copyTextFrom:
    label: Copy product price
    index: 1
    childOf:
      id: "product-tile-price"
      index: 0
- evalScript:
    script: ${output.productPrice = maestro.copiedText}
    label: Retain copied product price
- tapOn:
    id: "product-tile-1"
    label: "Tap on the second visible product"
- assertVisible: ${output.productName}.*
- assertVisible: ${output.productPrice}.*
- scroll
- runFlow:
    when:
      visible: Weight|Size
    commands:
      - tapOn:
          index: 0
          id: radio-card-container
          childOf:
            id: product-variants-container
- runFlow:
    when:
      visible: Purchase frequency
    commands:
      - scrollUntilVisible:
          centerElement: true
          element: Purchase frequency
      - tapOn:
          text: "one-time"
          label: "Select one time purchase"
      - assertVisible: You have selected one-time purchase.
- scrollUntilVisible:
    element: "Add to basket"
- tapOn: "Add to basket"
- runFlow:
    when:
      true: ${CLOSE_ACTIONSHEET}
    commands:
      - tapOn:
          id: action-sheet-header-close

Test run with the following CLI command: maestro test -e APP_ID=[app id] ./acceptance/maestro-poc/test.flow.yml

Tests run against the following simulator/emulator:
iOS: iPhone 15 Pro, iOS 17.5
Android: Google Pixel 8, API 35

Actual results

Maestro starts up and begins to run through the flow, however when it reaches a scroll or scrollUntilVisible command it will either pass or skip the step and move onto the next command, meanwhile the screen will remain stationary, before failing due to the test relying on the scrolling to make particular elements visible.

This applies to both Android and iOS.

The test failed debug report does not seem to allude to any issues.

Using Maestro studio I have tried to target the ScrollView but it does not seem to be available, this is also when adding a testID and also an accessible prop too.

Expected results

Once the test flow reaches the scroll and scrollUntilVisible commands within the test I would expect the screen to scroll and the desired elements to become visible.

About app

This is a closed source eCommerce app built using React Native 0.74.

Android target SDK: 34, minimum SDK: 23
iOS minimum version: 13.4

About environment

Maestro version: 1.39.5
OS: Mac OS X
OS version: 14.4.1
Architecture: aarch64

Logs

Logs Command returned an empty log
maestro bugreport

Test debug report

17:09:26.514 [ INFO] MAESTRO.logSystemInfo: ---- System Info ----
17:09:26.515 [ INFO] MAESTRO.logSystemInfo: Maestro Version: 1.39.5
17:09:26.515 [ INFO] MAESTRO.logSystemInfo: CI: Undefined
17:09:26.516 [ INFO] MAESTRO.logSystemInfo: OS Name: Mac OS X
17:09:26.516 [ INFO] MAESTRO.logSystemInfo: OS Version: 14.4.1
17:09:26.516 [ INFO] MAESTRO.logSystemInfo: Architecture: aarch64
17:09:26.516 [ INFO] MAESTRO.logSystemInfo: Java Version: 17
17:09:26.593 [DEBUG] io.micrometer.common.util.internal.logging.InternalLoggerFactory.newDefaultFactory: Using SLF4J as the default logging framework
17:09:26.620 [ INFO] MAESTRO.logSystemInfo: Xcode Version: 15.4
17:09:26.626 [ INFO] MAESTRO.logSystemInfo: Flutter Version: Undefined
17:09:26.629 [ INFO] MAESTRO.logSystemInfo: Flutter Channel: Undefined
17:09:26.629 [ INFO] MAESTRO.logSystemInfo: ---------------------
17:09:27.082 [ INFO] maestro.cli.command.TestCommand.runShardSuite: [shard 1] Selected device emulator-5554 using port 7001
17:09:29.136 [ INFO] maestro.Maestro.invoke: Getting device info
17:09:29.304 [ INFO] maestro.Maestro.invoke: Got device info: DeviceInfo(platform=ANDROID, widthPixels=1080, heightPixels=2400, widthGrid=1080, heightGrid=2400)
17:09:29.370 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Define variables RUNNING
17:09:29.373 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Define variables metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(defineVariablesCommand=DefineVariablesCommand(env={APP_ID=[app id], MAESTRO_FILENAME=poc.flow}, label=null, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:29.376 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Define variables COMPLETED
17:09:29.378 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Apply configuration RUNNING
17:09:29.382 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Apply configuration metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(applyConfigurationCommand=ApplyConfigurationCommand(config=MaestroConfig(appId=[app id], name=null, tags=[], ext={}, onFlowStart=null, onFlowComplete=null), label=null, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:29.384 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Apply configuration COMPLETED
17:09:29.385 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Clear state of ${APP_ID} RUNNING
17:09:29.387 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Clear state of ${APP_ID} metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(clearStateCommand=ClearStateCommand(appId=[app id], label=null, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:29.388 [ INFO] maestro.Maestro.clearAppState: Clearing app state [app id]
17:09:30.585 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Clear state of ${APP_ID} COMPLETED
17:09:30.586 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Launch app "${APP_ID}" RUNNING
17:09:30.589 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Launch app "${APP_ID}" metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(launchAppCommand=LaunchAppCommand(appId=[app id], clearState=null, clearKeychain=null, stopApp=null, permissions=null, launchArguments=null, label=null, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:31.362 [ INFO] maestro.Maestro.launchApp: Launching app [app id]
17:09:31.404 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Launch app "${APP_ID}" COMPLETED
17:09:31.406 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Dismiss welcome sheet if visible RUNNING
17:09:31.407 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Dismiss welcome sheet if visible metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(runFlowCommand=RunFlowCommand(commands=[MaestroCommand(tapOnElementCommand=TapOnElementCommand(selector=ElementSelector(textRegex=null, idRegex=action-sheet-header-close, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), retryIfNoChange=true, waitUntilVisible=false, longPress=false, repeat=null, waitToSettleTimeoutMs=null, label=null, optional=false))], condition=Condition(platform=null, visible=ElementSelector(textRegex=Welcome to the new Pets experience, idRegex=null, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), notVisible=null, scriptCondition=null, label=null), sourceDescription=null, config=null, label=Dismiss welcome sheet if visible, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:37.081 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Tap on id: action-sheet-header-close RUNNING
17:09:37.084 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Tap on id: action-sheet-header-close metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(tapOnElementCommand=TapOnElementCommand(selector=ElementSelector(textRegex=null, idRegex=action-sheet-header-close, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), retryIfNoChange=true, waitUntilVisible=false, longPress=false, repeat=null, waitToSettleTimeoutMs=null, label=null, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:37.624 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Tap on id: action-sheet-header-close metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(tapOnElementCommand=TapOnElementCommand(selector=ElementSelector(textRegex=null, idRegex=action-sheet-header-close, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), retryIfNoChange=true, waitUntilVisible=false, longPress=false, repeat=null, waitToSettleTimeoutMs=null, label=null, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=TapPoint(point=Point(x=981, y=502)))
17:09:37.625 [ INFO] maestro.Maestro.tap-BUbHBYE: Tapping on element:  UiElement(treeNode=TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=action-sheet-header-close, clickable=false, bounds=[950,471][1013,534], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=com.horcrux.svg.SvgView}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=, clickable=false, bounds=[950,471][1013,534], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=com.horcrux.svg.GroupView}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=, clickable=false, bounds=[950,471][1013,534], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=com.horcrux.svg.GroupView}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=, clickable=false, bounds=[950,471][1013,534], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=com.horcrux.svg.PathView}, children=[], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false), bounds=Bounds(x=950, y=471, width=63, height=63))
17:09:38.439 [ INFO] maestro.Maestro.tap-BUbHBYE: Refreshed element
17:09:38.439 [ INFO] maestro.Maestro.hierarchyBasedTap-hbl3e4M: Tapping at (981, 502) using hierarchy based logic for wait
17:09:38.439 [TRACE] maestro.utils.ScreenshotUtils.takeScreenshot: Taking screenshot to byte array
17:09:38.439 [TRACE] maestro.utils.ScreenshotUtils.takeScreenshot: Taking screenshot to output sink
17:09:40.026 [ INFO] maestro.Maestro.hierarchyBasedTap-hbl3e4M: Something have changed in the UI judging by view hierarchy. Proceed.
17:09:40.026 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Tap on id: action-sheet-header-close COMPLETED
17:09:40.027 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Dismiss welcome sheet if visible COMPLETED
17:09:40.028 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Ava product flow RUNNING
17:09:40.029 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Ava product flow metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(runFlowCommand=RunFlowCommand(commands=[MaestroCommand(defineVariablesCommand=DefineVariablesCommand(env={BRAND_NAME=Ava, CLOSE_ACTIONSHEET=true}, label=null, optional=false)), MaestroCommand(applyConfigurationCommand=ApplyConfigurationCommand(config=MaestroConfig(appId=[app id], name=null, tags=[], ext={}, onFlowStart=null, onFlowComplete=null), label=null, optional=false)), MaestroCommand(tapOnElementCommand=TapOnElementCommand(selector=ElementSelector(textRegex=null, idRegex=header-search-bar, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), retryIfNoChange=true, waitUntilVisible=false, longPress=false, repeat=null, waitToSettleTimeoutMs=null, label=null, optional=false)), MaestroCommand(inputTextCommand=InputTextCommand(text=${BRAND_NAME}, label=null, optional=false)), MaestroCommand(pressKeyCommand=PressKeyCommand(code=ENTER, label=null, optional=false)), MaestroCommand(scrollCommand=ScrollCommand()), MaestroCommand(copyTextFromCommand=CopyTextFromCommand(selector=ElementSelector(textRegex=null, idRegex=product-name, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=1, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), label=Copy product name, optional=false)), MaestroCommand(evalScriptCommand=EvalScriptCommand(scriptString=${output.productName = maestro.copiedText}, label=Retain copied product name, optional=false)), MaestroCommand(scrollUntilVisibleCommand=ScrollUntilVisibleCommand(selector=ElementSelector(textRegex=null, idRegex=product-list-tile, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=1, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), direction=DOWN, scrollDuration=40, visibilityPercentage=100, timeout=20000, waitToSettleTimeoutMs=null, centerElement=true, label=null, optional=false)), MaestroCommand(copyTextFromCommand=CopyTextFromCommand(selector=ElementSelector(textRegex=null, idRegex=null, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=1, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=ElementSelector(textRegex=null, idRegex=product-tile-price, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=0, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null)), label=Copy product price, optional=false)), MaestroCommand(evalScriptCommand=EvalScriptCommand(scriptString=${output.productPrice = maestro.copiedText}, label=Retain copied product price, optional=false)), MaestroCommand(tapOnElementCommand=TapOnElementCommand(selector=ElementSelector(textRegex=null, idRegex=product-tile-1, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), retryIfNoChange=true, waitUntilVisible=false, longPress=false, repeat=null, waitToSettleTimeoutMs=null, label=Tap on the second visible product, optional=false)), MaestroCommand(assertConditionCommand=AssertConditionCommand(condition=Condition(platform=null, visible=ElementSelector(textRegex=${output.productName}.*, idRegex=null, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), notVisible=null, scriptCondition=null, label=null), timeout=null, label=null, optional=false)), MaestroCommand(assertConditionCommand=AssertConditionCommand(condition=Condition(platform=null, visible=ElementSelector(textRegex=${output.productPrice}.*, idRegex=null, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), notVisible=null, scriptCondition=null, label=null), timeout=null, label=null, optional=false)), MaestroCommand(scrollCommand=ScrollCommand()), MaestroCommand(runFlowCommand=RunFlowCommand(commands=[MaestroCommand(tapOnElementCommand=TapOnElementCommand(selector=ElementSelector(textRegex=null, idRegex=radio-card-container, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=0, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=ElementSelector(textRegex=null, idRegex=product-variants-container, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null)), retryIfNoChange=true, waitUntilVisible=false, longPress=false, repeat=null, waitToSettleTimeoutMs=null, label=null, optional=false))], condition=Condition(platform=null, visible=ElementSelector(textRegex=Weight|Size, idRegex=null, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), notVisible=null, scriptCondition=null, label=null), sourceDescription=null, config=null, label=null, optional=false)), MaestroCommand(runFlowCommand=RunFlowCommand(commands=[MaestroCommand(scrollUntilVisibleCommand=ScrollUntilVisibleCommand(selector=ElementSelector(textRegex=Purchase frequency, idRegex=null, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), direction=DOWN, scrollDuration=40, visibilityPercentage=100, timeout=20000, waitToSettleTimeoutMs=null, centerElement=true, label=null, optional=false)), MaestroCommand(tapOnElementCommand=TapOnElementCommand(selector=ElementSelector(textRegex=one-time, idRegex=null, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), retryIfNoChange=true, waitUntilVisible=false, longPress=false, repeat=null, waitToSettleTimeoutMs=null, label=Select one time purchase, optional=false)), MaestroCommand(assertConditionCommand=AssertConditionCommand(condition=Condition(platform=null, visible=ElementSelector(textRegex=You have selected one-time purchase., idRegex=null, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), notVisible=null, scriptCondition=null, label=null), timeout=null, label=null, optional=false))], condition=Condition(platform=null, visible=ElementSelector(textRegex=Purchase frequency, idRegex=null, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), notVisible=null, scriptCondition=null, label=null), sourceDescription=null, config=null, label=null, optional=false)), MaestroCommand(scrollUntilVisibleCommand=ScrollUntilVisibleCommand(selector=ElementSelector(textRegex=Add to basket, idRegex=null, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), direction=DOWN, scrollDuration=40, visibilityPercentage=100, timeout=20000, waitToSettleTimeoutMs=null, centerElement=false, label=null, optional=false)), MaestroCommand(tapOnElementCommand=TapOnElementCommand(selector=ElementSelector(textRegex=Add to basket, idRegex=null, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), retryIfNoChange=true, waitUntilVisible=false, longPress=false, repeat=null, waitToSettleTimeoutMs=null, label=null, optional=false)), MaestroCommand(runFlowCommand=RunFlowCommand(commands=[MaestroCommand(tapOnElementCommand=TapOnElementCommand(selector=ElementSelector(textRegex=null, idRegex=action-sheet-header-close, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), retryIfNoChange=true, waitUntilVisible=false, longPress=false, repeat=null, waitToSettleTimeoutMs=null, label=null, optional=false))], condition=Condition(platform=null, visible=null, notVisible=null, scriptCondition=${CLOSE_ACTIONSHEET}, label=null), sourceDescription=null, config=null, label=null, optional=false))], condition=null, sourceDescription=productSearch.flow.yml, config=MaestroConfig(appId=[app id], name=null, tags=[], ext={}, onFlowStart=null, onFlowComplete=null), label=Ava product flow, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:40.030 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Define variables RUNNING
17:09:40.033 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Define variables metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(defineVariablesCommand=DefineVariablesCommand(env={BRAND_NAME=Ava, CLOSE_ACTIONSHEET=true}, label=null, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:40.036 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Define variables COMPLETED
17:09:40.037 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Apply configuration RUNNING
17:09:40.038 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Apply configuration metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(applyConfigurationCommand=ApplyConfigurationCommand(config=MaestroConfig(appId=[app id], name=null, tags=[], ext={}, onFlowStart=null, onFlowComplete=null), label=null, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:40.039 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Apply configuration COMPLETED
17:09:40.040 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Tap on id: header-search-bar RUNNING
17:09:40.041 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Tap on id: header-search-bar metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(tapOnElementCommand=TapOnElementCommand(selector=ElementSelector(textRegex=null, idRegex=header-search-bar, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), retryIfNoChange=true, waitUntilVisible=false, longPress=false, repeat=null, waitToSettleTimeoutMs=null, label=null, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:40.140 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Tap on id: header-search-bar metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(tapOnElementCommand=TapOnElementCommand(selector=ElementSelector(textRegex=null, idRegex=header-search-bar, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), retryIfNoChange=true, waitUntilVisible=false, longPress=false, repeat=null, waitToSettleTimeoutMs=null, label=null, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=TapPoint(point=Point(x=574, y=378)))
17:09:40.142 [ INFO] maestro.Maestro.tap-BUbHBYE: Tapping on element:  UiElement(treeNode=TreeNode(attributes={text=Search [co. name], accessibilityText=, hintText=Search [co. name], ignoreBoundsFiltering=false, resource-id=header-search-bar, clickable=true, bounds=[134,314][1014,442], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.widget.EditText}, children=[], clickable=true, enabled=true, focused=false, checked=false, selected=false), bounds=Bounds(x=134, y=314, width=880, height=128))
17:09:40.952 [ INFO] maestro.Maestro.tap-BUbHBYE: Refreshed element
17:09:40.952 [ INFO] maestro.Maestro.hierarchyBasedTap-hbl3e4M: Tapping at (574, 378) using hierarchy based logic for wait
17:09:40.952 [TRACE] maestro.utils.ScreenshotUtils.takeScreenshot: Taking screenshot to byte array
17:09:40.952 [TRACE] maestro.utils.ScreenshotUtils.takeScreenshot: Taking screenshot to output sink
17:09:42.904 [ INFO] maestro.Maestro.hierarchyBasedTap-hbl3e4M: Something have changed in the UI judging by view hierarchy. Proceed.
17:09:42.904 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Tap on id: header-search-bar COMPLETED
17:09:42.905 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Input text ${BRAND_NAME} RUNNING
17:09:42.907 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Input text ${BRAND_NAME} metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(inputTextCommand=InputTextCommand(text=Ava, label=null, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:42.909 [ INFO] maestro.Maestro.inputText: Inputting text: Ava
17:09:48.434 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Input text ${BRAND_NAME} COMPLETED
17:09:48.435 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Press Enter key RUNNING
17:09:48.437 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Press Enter key metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(pressKeyCommand=PressKeyCommand(code=ENTER, label=null, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:48.437 [ INFO] maestro.Maestro.pressKey: Pressing key ENTER
17:09:52.215 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Press Enter key COMPLETED
17:09:52.217 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scroll vertically RUNNING
17:09:52.217 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scroll vertically metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(scrollCommand=ScrollCommand()), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:52.218 [ INFO] maestro.Maestro.scrollVertical: Scrolling vertically
17:09:53.928 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scroll vertically COMPLETED
17:09:53.929 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Copy product name RUNNING
17:09:53.931 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Copy product name metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(copyTextFromCommand=CopyTextFromCommand(selector=ElementSelector(textRegex=null, idRegex=product-name, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=1, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), label=Copy product name, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:54.012 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Copy product name metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(copyTextFromCommand=CopyTextFromCommand(selector=ElementSelector(textRegex=null, idRegex=product-name, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=1, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), label=Copy product name, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=TapPoint(point=Point(x=739, y=1268)))
17:09:54.014 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Copy product name COMPLETED
17:09:54.014 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Retain copied product name RUNNING
17:09:54.015 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Retain copied product name metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(evalScriptCommand=EvalScriptCommand(scriptString=${output.productName = maestro.copiedText}, label=Retain copied product name, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:54.016 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Retain copied product name COMPLETED
17:09:54.017 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scrolling DOWN until id: product-list-tile, Index: 1 is visible. RUNNING
17:09:54.018 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scrolling DOWN until id: product-list-tile, Index: 1 is visible. metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(scrollUntilVisibleCommand=ScrollUntilVisibleCommand(selector=ElementSelector(textRegex=null, idRegex=product-list-tile, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=1, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), direction=DOWN, scrollDuration=601, visibilityPercentage=100, timeout=20000, waitToSettleTimeoutMs=null, centerElement=true, label=null, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:54.097 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scrolling DOWN until id: product-list-tile, Index: 1 is visible. COMPLETED
17:09:54.098 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Copy product price RUNNING
17:09:54.099 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Copy product price metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(copyTextFromCommand=CopyTextFromCommand(selector=ElementSelector(textRegex=null, idRegex=null, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=1, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=ElementSelector(textRegex=null, idRegex=product-tile-price, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=0, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null)), label=Copy product price, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:54.173 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Copy product price metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(copyTextFromCommand=CopyTextFromCommand(selector=ElementSelector(textRegex=null, idRegex=null, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=1, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=ElementSelector(textRegex=null, idRegex=product-tile-price, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=0, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null)), label=Copy product price, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=TapPoint(point=Point(x=554, y=914)))
17:09:54.175 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Copy product price COMPLETED
17:09:54.175 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Retain copied product price RUNNING
17:09:54.176 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Retain copied product price metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(evalScriptCommand=EvalScriptCommand(scriptString=${output.productPrice = maestro.copiedText}, label=Retain copied product price, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:54.177 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Retain copied product price COMPLETED
17:09:54.177 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Tap on the second visible product RUNNING
17:09:54.178 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Tap on the second visible product metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(tapOnElementCommand=TapOnElementCommand(selector=ElementSelector(textRegex=null, idRegex=product-tile-1, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), retryIfNoChange=true, waitUntilVisible=false, longPress=false, repeat=null, waitToSettleTimeoutMs=null, label=Tap on the second visible product, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:54.253 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Tap on the second visible product metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(tapOnElementCommand=TapOnElementCommand(selector=ElementSelector(textRegex=null, idRegex=product-tile-1, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), retryIfNoChange=true, waitUntilVisible=false, longPress=false, repeat=null, waitToSettleTimeoutMs=null, label=Tap on the second visible product, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=TapPoint(point=Point(x=540, y=1460)))
17:09:54.254 [ INFO] maestro.Maestro.tap-BUbHBYE: Tapping on element:  UiElement(treeNode=TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=product-tile-1, clickable=false, bounds=[42,1127][1038,1794], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.ViewGroup}, children=[TreeNode(attributes={text=, accessibilityText=AVA Hypoallergenic Bone Broth Wet Adult Dog Food Topper Chicken, 200g, £1.99, easy-repeat, Save 5%, hintText=, ignoreBoundsFiltering=false, resource-id=, clickable=true, bounds=[45,1130][1035,1791], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.widget.Button}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=, clickable=false, bounds=[45,1130][441,1791], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.ViewGroup}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=, clickable=false, bounds=[45,1162][436,1761], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.widget.ImageView}, children=[], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false), TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=stack, clickable=false, bounds=[494,1172][984,1589], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.ViewGroup}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=Stack-MotiChild-1, clickable=false, bounds=[494,1172][984,1364], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.ViewGroup}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=stack, clickable=false, bounds=[494,1172][984,1364], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.ViewGroup}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=Stack-MotiChild-1, clickable=false, bounds=[494,1172][984,1364], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.ViewGroup}, children=[TreeNode(attributes={text=AVA Hypoallergenic Bone Broth Wet Adult Dog Food Topper Chicken, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=product-name, clickable=false, bounds=[494,1172][984,1364], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.widget.TextView}, children=[], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false), TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=Stack-MotiChild-2, clickable=false, bounds=[494,1385][984,1463], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.ViewGroup}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=stack, clickable=false, bounds=[494,1385][984,1430], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.ViewGroup}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=Stack-MotiChild-1, clickable=false, bounds=[494,1385][984,1430], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.ViewGroup}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=weight-variant-container, clickable=false, bounds=[494,1385][984,1430], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.ViewGroup}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=Stack-MotiChild-1, clickable=false, bounds=[494,1385][582,1430], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.ViewGroup}, children=[TreeNode(attributes={text=200g, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=, clickable=false, bounds=[494,1385][582,1430], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.widget.TextView}, children=[], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false), TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=Stack-MotiChild-3, clickable=false, bounds=[494,1484][984,1589], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.ViewGroup}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=, clickable=false, bounds=[494,1495][984,1556], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.widget.TextView}, children=[], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false), TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=stack, clickable=false, bounds=[494,1589][984,1655], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.ViewGroup}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=Stack-MotiChild-1, clickable=false, bounds=[494,1589][984,1655], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.ViewGroup}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=product-tile-price, clickable=false, bounds=[494,1589][984,1655], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.ViewGroup}, children=[TreeNode(attributes={text=£1.99, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=, clickable=false, bounds=[494,1589][614,1655], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.widget.TextView}, children=[], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false), TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=easy-repeat-tile, clickable=false, bounds=[473,1687][975,1750], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.ViewGroup}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=Stack-MotiChild-1, clickable=false, bounds=[473,1687][781,1750], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.ViewGroup}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=tag-container, clickable=false, bounds=[473,1687][781,1750], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.ViewGroup}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=Stack-MotiChild-1, clickable=false, bounds=[505,1703][536,1735], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.ViewGroup}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=svg-icon-container, clickable=false, bounds=[505,1703][536,1735], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.View}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=tag-icon-left, clickable=false, bounds=[505,1703][536,1735], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=com.horcrux.svg.SvgView}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=, clickable=false, bounds=[505,1704][536,1732], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=com.horcrux.svg.GroupView}, children=[TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=, clickable=false, bounds=[505,1704][536,1732], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=com.horcrux.svg.PathView}, children=[], clickable=false, enabled=true, focused=false, checked=false, selected=false), TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=, clickable=false, bounds=[514,1713][524,1723], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=com.horcrux.svg.PathView}, children=[], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false), TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=Stack-MotiChild-2, clickable=false, bounds=[557,1696][749,1741], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.ViewGroup}, children=[TreeNode(attributes={text=easy-repeat, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=tag-easy-repeat, clickable=false, bounds=[557,1696][749,1741], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.widget.TextView}, children=[], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false), TreeNode(attributes={text=, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=Stack-MotiChild-2, clickable=false, bounds=[812,1696][975,1741], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.view.ViewGroup}, children=[TreeNode(attributes={text=Save 5%, accessibilityText=, hintText=, ignoreBoundsFiltering=false, resource-id=, clickable=false, bounds=[812,1696][943,1741], enabled=true, focused=false, checked=false, scrollable=false, selected=false, class=android.widget.TextView}, children=[], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false)], clickable=true, enabled=true, focused=false, checked=false, selected=false)], clickable=false, enabled=true, focused=false, checked=false, selected=false), bounds=Bounds(x=42, y=1127, width=996, height=667))
17:09:55.077 [ INFO] maestro.Maestro.tap-BUbHBYE: Refreshed element
17:09:55.077 [ INFO] maestro.Maestro.hierarchyBasedTap-hbl3e4M: Tapping at (540, 1460) using hierarchy based logic for wait
17:09:55.077 [TRACE] maestro.utils.ScreenshotUtils.takeScreenshot: Taking screenshot to byte array
17:09:55.077 [TRACE] maestro.utils.ScreenshotUtils.takeScreenshot: Taking screenshot to output sink
17:09:55.930 [TRACE] maestro.utils.ScreenshotUtils.takeScreenshot: Taking screenshot to byte array
17:09:55.930 [TRACE] maestro.utils.ScreenshotUtils.takeScreenshot: Taking screenshot to output sink
17:09:57.918 [ INFO] maestro.Maestro.hierarchyBasedTap-hbl3e4M: Something have changed in the UI judging by screenshot (d=7.5787034). Proceed.
17:09:57.918 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Tap on the second visible product COMPLETED
17:09:57.919 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Assert that "${output.productName}.*" is visible RUNNING
17:09:57.921 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Assert that "${output.productName}.*" is visible metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(assertConditionCommand=AssertConditionCommand(condition=Condition(platform=null, visible=ElementSelector(textRegex=AVA Hypoallergenic Bone Broth Wet Adult Dog Food Topper Chicken.*, idRegex=null, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), notVisible=null, scriptCondition=null, label=null), timeout=null, label=null, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:58.787 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Assert that "${output.productName}.*" is visible COMPLETED
17:09:58.789 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Assert that "${output.productPrice}.*" is visible RUNNING
17:09:58.791 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Assert that "${output.productPrice}.*" is visible metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(assertConditionCommand=AssertConditionCommand(condition=Condition(platform=null, visible=ElementSelector(textRegex=£1.99.*, idRegex=null, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), notVisible=null, scriptCondition=null, label=null), timeout=null, label=null, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:58.891 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Assert that "${output.productPrice}.*" is visible COMPLETED
17:09:58.892 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scroll vertically RUNNING
17:09:58.893 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scroll vertically metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(scrollCommand=ScrollCommand()), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:09:58.894 [ INFO] maestro.Maestro.scrollVertical: Scrolling vertically
17:10:00.308 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scroll vertically COMPLETED
17:10:00.309 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Run flow when "Weight|Size" is visible RUNNING
17:10:00.310 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Run flow when "Weight|Size" is visible metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(runFlowCommand=RunFlowCommand(commands=[MaestroCommand(tapOnElementCommand=TapOnElementCommand(selector=ElementSelector(textRegex=null, idRegex=radio-card-container, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=0, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=ElementSelector(textRegex=null, idRegex=product-variants-container, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null)), retryIfNoChange=true, waitUntilVisible=false, longPress=false, repeat=null, waitToSettleTimeoutMs=null, label=null, optional=false))], condition=Condition(platform=null, visible=ElementSelector(textRegex=Weight|Size, idRegex=null, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), notVisible=null, scriptCondition=null, label=null), sourceDescription=null, config=null, label=null, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:10:07.436 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Run flow when "Weight|Size" is visible SKIPPED
17:10:07.438 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Run flow when "Purchase frequency" is visible RUNNING
17:10:07.439 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Run flow when "Purchase frequency" is visible metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(runFlowCommand=RunFlowCommand(commands=[MaestroCommand(scrollUntilVisibleCommand=ScrollUntilVisibleCommand(selector=ElementSelector(textRegex=Purchase frequency, idRegex=null, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), direction=DOWN, scrollDuration=40, visibilityPercentage=100, timeout=20000, waitToSettleTimeoutMs=null, centerElement=true, label=null, optional=false)), MaestroCommand(tapOnElementCommand=TapOnElementCommand(selector=ElementSelector(textRegex=one-time, idRegex=null, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), retryIfNoChange=true, waitUntilVisible=false, longPress=false, repeat=null, waitToSettleTimeoutMs=null, label=Select one time purchase, optional=false)), MaestroCommand(assertConditionCommand=AssertConditionCommand(condition=Condition(platform=null, visible=ElementSelector(textRegex=You have selected one-time purchase., idRegex=null, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), notVisible=null, scriptCondition=null, label=null), timeout=null, label=null, optional=false))], condition=Condition(platform=null, visible=ElementSelector(textRegex=Purchase frequency, idRegex=null, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), notVisible=null, scriptCondition=null, label=null), sourceDescription=null, config=null, label=null, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:10:07.584 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Run flow when "Purchase frequency" is visible SKIPPED
17:10:07.585 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scrolling DOWN until "Add to basket" is visible. RUNNING
17:10:07.586 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scrolling DOWN until "Add to basket" is visible. metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=MaestroCommand(scrollUntilVisibleCommand=ScrollUntilVisibleCommand(selector=ElementSelector(textRegex=Add to basket, idRegex=null, size=null, below=null, above=null, leftOf=null, rightOf=null, containsChild=null, containsDescendants=null, traits=null, index=null, enabled=null, optional=false, selected=null, checked=null, focused=null, childOf=null), direction=DOWN, scrollDuration=601, visibilityPercentage=100, timeout=20000, waitToSettleTimeoutMs=null, centerElement=false, label=null, optional=false)), logMessages=[], insight=Insight(message=, level=NONE), action=null)
17:10:09.280 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scrolling DOWN until "Add to basket" is visible. metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=null, logMessages=[], insight=Insight(message=, level=NONE), action=MultipleSwipePoint(direction=UP, points=[Point(x=540, y=1200)]))
17:10:09.325 [ INFO] maestro.Maestro.swipeFromCenter: Swiping UP from center
17:10:10.681 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scrolling DOWN until "Add to basket" is visible. metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=null, logMessages=[], insight=Insight(message=, level=NONE), action=MultipleSwipePoint(direction=UP, points=[Point(x=540, y=1200), Point(x=540, y=1200)]))
17:10:10.687 [ INFO] maestro.Maestro.swipeFromCenter: Swiping UP from center
17:10:12.913 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scrolling DOWN until "Add to basket" is visible. metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=null, logMessages=[], insight=Insight(message=, level=NONE), action=MultipleSwipePoint(direction=UP, points=[Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200)]))
17:10:12.958 [ INFO] maestro.Maestro.swipeFromCenter: Swiping UP from center
17:10:15.379 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scrolling DOWN until "Add to basket" is visible. metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=null, logMessages=[], insight=Insight(message=, level=NONE), action=MultipleSwipePoint(direction=UP, points=[Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200)]))
17:10:15.426 [ INFO] maestro.Maestro.swipeFromCenter: Swiping UP from center
17:10:16.839 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scrolling DOWN until "Add to basket" is visible. metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=null, logMessages=[], insight=Insight(message=, level=NONE), action=MultipleSwipePoint(direction=UP, points=[Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200)]))
17:10:16.842 [ INFO] maestro.Maestro.swipeFromCenter: Swiping UP from center
17:10:18.947 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scrolling DOWN until "Add to basket" is visible. metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=null, logMessages=[], insight=Insight(message=, level=NONE), action=MultipleSwipePoint(direction=UP, points=[Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200)]))
17:10:18.950 [ INFO] maestro.Maestro.swipeFromCenter: Swiping UP from center
17:10:21.317 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scrolling DOWN until "Add to basket" is visible. metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=null, logMessages=[], insight=Insight(message=, level=NONE), action=MultipleSwipePoint(direction=UP, points=[Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200)]))
17:10:21.362 [ INFO] maestro.Maestro.swipeFromCenter: Swiping UP from center
17:10:22.740 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scrolling DOWN until "Add to basket" is visible. metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=null, logMessages=[], insight=Insight(message=, level=NONE), action=MultipleSwipePoint(direction=UP, points=[Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200)]))
17:10:22.785 [ INFO] maestro.Maestro.swipeFromCenter: Swiping UP from center
17:10:24.957 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scrolling DOWN until "Add to basket" is visible. metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=null, logMessages=[], insight=Insight(message=, level=NONE), action=MultipleSwipePoint(direction=UP, points=[Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200)]))
17:10:25.001 [ INFO] maestro.Maestro.swipeFromCenter: Swiping UP from center
17:10:27.320 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scrolling DOWN until "Add to basket" is visible. metadata CommandMetadata(numberOfRuns=null, evaluatedCommand=null, logMessages=[], insight=Insight(message=, level=NONE), action=MultipleSwipePoint(direction=UP, points=[Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200), Point(x=540, y=1200)]))
17:10:27.367 [ INFO] maestro.Maestro.swipeFromCenter: Swiping UP from center
17:10:28.212 [ INFO] maestro.Maestro.takeScreenshot: Taking screenshot
17:10:28.212 [TRACE] maestro.utils.ScreenshotUtils.takeScreenshot: Taking screenshot to output sink
17:10:28.305 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Scrolling DOWN until "Add to basket" is visible. FAILED
17:10:28.306 [ INFO] maestro.cli.runner.MaestroCommandRunner.invoke: Ava product flow FAILED

Maestro version

1.39.5

How did you install Maestro?

Homebrew

Anything else?

No response

Copy link

linear bot commented Dec 17, 2024

@kris-luminar
Copy link

I had the same issue. Worked around it by selecting a text input on the view I wanted to scroll and then dragging on it. In my case, the issue was that the view I wanted to scroll was a modal on top of the base one and it looks like Maestro was trying to scroll the base layer until I did this workaround.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants