Testing Real-Time User Interaction with Multiple Simultaneous Appium Sessions in Java

Quick Answers: Running Multiple Appium Sessions on a Single Server

  1. Start a Single Appium Server:
   appium --port 4723
  1. Create Multiple Appium Drivers (Java):
   import io.appium.java_client.AppiumDriver;
   import org.openqa.selenium.remote.DesiredCapabilities;
   import java.net.URL;

   DesiredCapabilities caps1 = new DesiredCapabilities();
   caps1.setCapability("deviceName", "emulator-5554");
   AppiumDriver driver1 = new AppiumDriver(new URL("http://localhost:4723/wd/hub"), caps1);

   DesiredCapabilities caps2 = new DesiredCapabilities();
   caps2.setCapability("deviceName", "emulator-5556");
   AppiumDriver driver2 = new AppiumDriver(new URL("http://localhost:4723/wd/hub"), caps2);
  1. Perform Real-Time Interactions:
   driver1.findElement(By.id("message")).sendKeys("Hello!");
   driver1.findElement(By.id("send")).click();
   assert driver2.findElement(By.id("chat")).getText().contains("Hello!");

Introduction

Testing real-time user interactions, such as chat or multiplayer features, requires simulating multiple users acting concurrently. In Appium, multiple simultaneous Appium sessions can be managed on a single Appium server to control different devices, enabling realistic multi-user testing scenarios. Inspired by Appium Pro’s approach, this guide demonstrates how to use a single Appium server in Java to test real-time interactions across multiple devices. For example, we’ll simulate a chat app interaction, with practical examples and best practices. Whether you’re new to Appium or automating complex mobile tests, this post will help you master multi-device testing efficiently.

Why Use Multiple Simultaneous Appium Sessions?

Running multiple sessions on one Appium server is valuable for:

  • Real-time testing: Simulate chat apps or multiplayer games where users interact instantly.
  • Multi-user scenarios: Test features like ridesharing or food delivery involving multiple parties.
  • Resource efficiency: Use a single server to manage multiple devices, reducing setup complexity.
  • End-to-end validation: Ensure server-client interactions work as expected in real-world conditions.

However, coordinating sessions requires careful configuration to avoid resource conflicts.

Detailed Explanation: Setting Up Multiple Sessions on a Single Appium Server

The Appium Pro article showcases a single Appium server handling multiple sessions by assigning unique devices to each driver, avoiding port conflicts. Here’s how to implement it in Java, based on their chat app example.

Step 1: Start a Single Appium Server

Launch one Appium server on a default or custom port.

  • Command:
  appium --port 4723
  • What it does:
  • Starts an Appium server capable of handling multiple sessions.
  • No additional servers are needed, simplifying the setup.
Step 2: Configure Desired Capabilities for Each Device

Define unique DesiredCapabilities for each device, ensuring they connect to the same Appium server.

  • Code:
  import io.appium.java_client.AppiumDriver;
  import org.openqa.selenium.remote.DesiredCapabilities;
  import java.net.URL;

  // First device (User 1)
  DesiredCapabilities caps1 = new DesiredCapabilities();
  caps1.setCapability("platformName", "Android");
  caps1.setCapability("deviceName", "emulator-5554");
  caps1.setCapability("app", "/path/to/chat.apk");
  caps1.setCapability("automationName", "UiAutomator2");
  AppiumDriver driver1 = new AppiumDriver(new URL("http://localhost:4723/wd/hub"), caps1);

  // Second device (User 2)
  DesiredCapabilities caps2 = new DesiredCapabilities();
  caps2.setCapability("platformName", "Android");
  caps2.setCapability("deviceName", "emulator-5556");
  caps2.setCapability("app", "/path/to/chat.apk");
  caps2.setCapability("automationName", "UiAutomator2");
  AppiumDriver driver2 = new AppiumDriver(new URL("http://localhost:4723/wd/hub"), caps2);
  • What it does:
  • Creates two AppiumDriver instances, each targeting a different device (e.g., emulators).
  • Both drivers connect to the same server (http://localhost:4723/wd/hub).
  • Unique deviceName ensures no session conflicts.
Step 3: Automate Real-Time Interactions

Use the drivers to simulate a user flow, such as a chat between two users.

  • Example (Chat App Test):
  // User 1: Log in and send a message
  driver1.findElement(By.id("username")).sendKeys("Langston");
  driver1.findElement(By.id("channel")).sendKeys("Harlem");
  driver1.findElement(By.id("join")).click();
  driver1.findElement(By.id("message")).sendKeys("What happens to a dream deferred?");
  driver1.findElement(By.id("send")).click();

  // User 2: Log in and verify message
  driver2.findElement(By.id("username")).sendKeys("Hughes");
  driver2.findElement(By.id("channel")).sendKeys("Harlem");
  driver2.findElement(By.id("join")).click();
  WebElement chat = driver2.findElement(By.id("chat"));
  assert chat.getText().contains("What happens to a dream deferred?");
  • What it does:
  • Simulates User 1 sending a message and User 2 receiving it in a chat app.
  • Tests real-time interaction without mocking server responses.
Step 4: Synchronize Actions

Ensure actions are timed correctly using WebDriverWait for reliable testing.

  • Example:
  import org.openqa.selenium.support.ui.WebDriverWait;
  import org.openqa.selenium.support.ui.ExpectedConditions;

  // Wait for User 1 to join channel
  new WebDriverWait(driver1, 10)
      .until(ExpectedConditions.elementToBeClickable(By.id("send")))
      .click();

  // Wait for User 2 to see message
  new WebDriverWait(driver2, 10)
      .until(ExpectedConditions.textToBe(By.id("chat"), "What happens to a dream deferred?"));
Step 5: Clean Up

Close all drivers to free resources.

  • Code:
  driver1.quit();
  driver2.quit();

Practical Examples

  1. Chat App Interaction:
   driver1.findElement(By.id("message")).sendKeys("Hello!");
   driver1.findElement(By.id("send")).click();
   new WebDriverWait(driver2, 10)
       .until(ExpectedConditions.textToBe(By.id("chat"), "Hello!"));
  1. Ridesharing App Test:
   driver1.findElement(By.id("request_ride")).click();
   new WebDriverWait(driver2, 10)
       .until(ExpectedConditions.elementToBeClickable(By.id("accept_ride")))
       .click();

Best Practices for Multiple Sessions

  • Use unique device identifiers: Ensure deviceName or udid is distinct for each session to avoid conflicts.
  • Set appropriate capabilities: Include automationName (e.g., UiAutomator2) and unique ports if needed (e.g., systemPort for Android).
  • Synchronize with waits: Use WebDriverWait to handle timing dependencies in real-time flows.
  • Clean up sessions: Call driver.quit() to prevent resource leaks.
  • Log actions: Add logging for debugging:
  import java.util.logging.Logger;
  Logger.getLogger("Test").info("User 1 sent message");
  • Test on real devices: Validate on physical devices to account for network latency.

Common Pitfalls and How to Avoid Them

  • Session conflicts: Use unique deviceName or udid to prevent overlap on the same server.
  • Timing issues: Avoid Thread.sleep; use WebDriverWait for reliable synchronization.
  • Resource leaks: Ensure driver.quit() is called in a finally block.
  • Network delays: Test with real devices to simulate actual conditions.
  • Server overload: Monitor server performance; consider Selenium Grid for scaling.

Conclusion

Using multiple simultaneous Appium sessions on a single Appium server in Java, as demonstrated by Appium Pro, enables efficient testing of real-time user interactions like chat or ridesharing apps. By configuring unique drivers and coordinating actions, you can simulate multi-user scenarios seamlessly. For instance, this approach ensures accurate end-to-end testing without complex server setups. Therefore, by following best practices like synchronization and cleanup, you’ll build robust Appium tests that mirror real-world usage. Check out the full code sample on GitHub for more details

Got an Appium question or a multi-device testing tip? Share it in the comments or explore our Appium tutorials for more insights!

Call to Action

Loved this guide? Subscribe to our newsletter for more Appium tips, or check out our mobile automation resources to level up your skills. Let’s make your Appium tests realistic and efficient!


Previous Article

How to Use a Tap by Location Helper for Unresponsive Elements in Appium

Next Article

How to Retrieve Clipboard Text from a Real iOS Device with Appium in Java

Write a Comment

Leave a Comment

Your email address will not be published. Required fields are marked *

Subscribe to our Newsletter

Subscribe to our email newsletter to get the latest posts delivered right to your email.
Pure inspiration, zero spam ✨