Katalon Waits for Unused ListView Even When Not Referenced

I’m automating a mobile app using Katalon Studio with Appium. My screen contains two ListView components:

ListView1: All items are fully loaded and visible.
ListView2: Contains dynamically loading content and takes a long time to finish loading.

In my test script, I am only interacting with ListView1 and its items. There is no code referencing or interacting with ListView2 at all.

Even though I explicitly work only with ListView1, Appium seems to wait for ListView2 to finish loading before proceeding. This causes unnecessary delay (even up to minutes), despite having the default timeout set to 10 seconds for the entire script.

Machine: Windows 10
Katalon version: 10.0.0
Appium version:
2.12.1
Device under test: Galaxy note 20

1 Like

To resolve the issue where Katalon/Appium unnecessarily waits for ListView2 even when your script only interacts with ListView1, here are actionable solutions:

1. Disable Implicit Waits Before Interaction

Temporarily set the implicit wait to 0 to bypass waiting for all elements (including ListView2). Use explicit waits only for the elements you need:

// Set implicit wait to 0 before interacting with ListView1
Mobile.setImplicitWaitTimeout(0)

// Use explicit wait for ListView1's elements (e.g., a specific item)
Mobile.waitForElementPresent(findTestObject('ListView1_Item'), 10)

// Re-enable implicit wait after interaction (if needed elsewhere)
Mobile.setImplicitWaitTimeout(10)

2. Use MobileElement Indexes for Faster Lookups

If ListView1 is the first ListView in the hierarchy, bypass queries for ListView2 by using index-based selection:

// Select the first ListView (index 0) in the hierarchy
MobileElement listView1 = Mobile.findElementsByClassName('android.widget.ListView').get(0)

3. Override Appium’s Automatic Wait with mobile:waitForIdleTimeout

Force Appium to skip waiting for the app to “idle” (e.g., during dynamic loading of ListView2):

// Add capability to your driver setup (in Katalon's Desired Capabilities)
"appium:waitForIdleTimeout" -> 0 // Disable waiting for app idle state

4. Bypass Appium’s Default Waiting Mechanism

Use direct execution with JavaScript to interact with elements immediately:

Mobile.executeScript('mobile: click', [
   'elementId': ((WebElement) findTestObject('ListView1_Item').findWebElement()).getId()
])

5. Check for Ancestor Contexts

Ensure ListView1 is not nested within a container that includes ListView2. Refine your object locators to target ListView1 specifically:

// Use a more specific XPath or resource-id for ListView1
Mobile.waitForElementPresent(
   findTestObject('ListView1', [('resource-id') : 'com.app:id/list_view_1']),
   10
)

6. Adjust Katalon’s Global Timeout Settings

Navigate to Project Settings > Execution > Default Wait For Element Timeout and reduce it (e.g., to 5 seconds) to minimize waiting across the entire script.

Example Workflow:

// Disable implicit waits
Mobile.setImplicitWaitTimeout(0)

// Explicitly wait for ListView1's item (10 seconds max)
Mobile.waitForElementPresent(findTestObject('ListView1_Item'), 10)

// Interact with ListView1
Mobile.tap(findTestObject('ListView1_Item'), 10)

// Re-enable implicit wait if needed
Mobile.setImplicitWaitTimeout(10)

Additional Notes:

  • Appium Logs: Check Appium logs to identify if ListView2 is being auto-queried (look for finding elements entries).
  • Dynamic Content: If ListView2’s loading blocks the UI thread, ask developers to lazy-load it in the background.

By focusing waits only on required elements and bypassing Appium’s default behavior, you can eliminate unnecessary delays.