Hybrid App Testing on Real Devices: Native Screens and In-App WebViews
Your Ionic or Capacitor app is half native and half web page, and each half has its own tools. Test both in one session on a real iPhone or Android phone, with full DevTools on the WebViews inside your app: console, network and DOM. Switch between NATIVE_APP and WEBVIEW in Appium, or let an AI agent do it over MCP.
Full DevTools on Your WebViews
Console, network and DOM on the web content inside your app, on real iOS and Android devices. Not only Safari and Chrome pages.
Native Screens and Web Content in One Session
Tap through a native screen, land in a WebView, inspect it, and go back. One live session on one real device, with no switching tools.
One Network Capture, Native and Web
See the calls from native code and from the web content side by side, and mock a response on the device to test an error state.
AI Agents Read the Console and DOM
Over MCP, Claude, Cursor or your own agent reads the console and the DOM of a WebView and drives both the native layer and the web layer.
Appium Context Switching
Switch between NATIVE_APP and WEBVIEW contexts, the standard Appium route for hybrid apps. Your existing suite runs against real devices with only the endpoint changed.
Ionic, Capacitor, Cordova and More
Ionic, Capacitor and Cordova apps, or any app that embeds web views, are examples of what you can test this way.
Switch from Native to WebView in Appium
Standard Appium context switching, on Android and iOS. Only the endpoint changes.
import { remote } from 'webdriverio';
const driver = await remote({
protocol: 'https',
hostname: '<subdomain>.robotactions.com',
port: 443,
path: '/',
headers: { Authorization: `Bearer ${process.env.RA_API_TOKEN}` },
capabilities: {
platformName: 'Android',
'appium:automationName': 'UiAutomator2',
'appium:appPackage': 'com.example.myhybridapp',
'appium:appActivity': '.MainActivity'
}
});
// Native screen first
await driver.$('~open-help').click();
// Find the WebView context and switch to it
const contexts = await driver.getContexts();
const webview = contexts.find((c) => String(c).includes('WEBVIEW'));
await driver.switchContext(webview);
// Standard CSS selectors now work on the web content
await driver.$('h1.title').waitForDisplayed();
console.log(await driver.$('h1.title').getText());
// Back to the native layer
await driver.switchContext('NATIVE_APP');
await driver.deleteSession();Debug the Web Half of Your App
The free tier gives you one device and needs no credit card. Open your build and inspect a WebView on real hardware.