Handle System Alerts in native android

I am using native android apps and need to automate. I am stuck at a point where appium does not identify system alert pop ups.

I have tried adding implicit wait conditions, thread.sleep, and switchTo alerts. Nothing seems to work in this case.

driver.manage().timeouts().implicitlyWait(25,TimeUnit.SECONDS);
MobileElement clickOK= (MobileElement) driver.findElement(By.id(“android:id/button1”));

(and)

driver.switchTo().accept().alert();
alert.accept();

  1. if it permission you can accept them ALL on driver start with capabilities
capabilities.setCapability(AndroidMobileCapabilityType.AUTO_GRANT_PERMISSIONS, true);
  1. if not -> show us your dialog with pageSource tree

No, the alerts are not permissions. Here is the HTML

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<hierarchy index="0" class="hierarchy" rotation="0" width="1080" height="2061">

<android.widget.FrameLayout index=“0” package=“com.appname” class=“android.widget.FrameLayout” text="" checkable=“false” checked=“false” clickable=“false” enabled=“true” focusable=“false” focused=“false” long-clickable=“false” password=“false” scrollable=“false” selected=“false” bounds="[28,848][964,1302]" displayed=“true”>
<android.widget.FrameLayout index=“0” package=“com.appname” class=“android.widget.FrameLayout” text="" checkable=“false” checked=“false” clickable=“false” enabled=“true” focusable=“false” focused=“false” long-clickable=“false” password=“false” scrollable=“false” selected=“false” bounds="[72,892][964,1302]" displayed=“true”>
<android.widget.FrameLayout index=“0” package=“com.appname” class=“android.widget.FrameLayout” text="" resource-id=“android:id/content” checkable=“false” checked=“false” clickable=“false” enabled=“true” focusable=“false” focused=“false” long-clickable=“false” password=“false” scrollable=“false” selected=“false” bounds="[72,892][964,1302]" displayed=“true”>
<android.widget.LinearLayout index=“0” package=“com.appname” class=“android.widget.LinearLayout” text="" resource-id=“android:id/parentPanel” checkable=“false” checked=“false” clickable=“false” enabled=“true” focusable=“false” focused=“false” long-clickable=“false” password=“false” scrollable=“false” selected=“false” bounds="[72,892][964,1302]" displayed=“true”>
<android.widget.LinearLayout index=“0” package=“com.appname” class=“android.widget.LinearLayout” text="" resource-id=“android:id/topPanel” checkable=“false” checked=“false” clickable=“false” enabled=“true” focusable=“false” focused=“false” long-clickable=“false” password=“false” scrollable=“false” selected=“false” bounds="[72,892][964,1043]" displayed=“true”>
<android.widget.LinearLayout index=“0” package=“com.appname” class=“android.widget.LinearLayout” text="" resource-id=“android:id/title_template” checkable=“false” checked=“false” clickable=“false” enabled=“true” focusable=“false” focused=“false” long-clickable=“false” password=“false” scrollable=“false” selected=“false” bounds="[72,892][964,1021]" displayed=“true”>
<android.widget.TextView index=“0” package=“com.appanme” class=“android.widget.TextView” text=“Message” resource-id=“android:id/alertTitle” checkable=“false” checked=“false” clickable=“false” enabled=“true” focusable=“false” focused=“false” long-clickable=“false” password=“false” scrollable=“false” selected=“false” bounds="[138,942][942,1021]" displayed=“true” />
</android.widget.LinearLayout>
<android.view.View index=“1” package=“com.appname” class=“android.view.View” text="" resource-id=“android:id/titleDividerNoCustom” checkable=“false” checked=“false” clickable=“false” enabled=“true” focusable=“false” focused=“false” long-clickable=“false” password=“false” scrollable=“false” selected=“false” bounds="[72,1021][964,1043]" displayed=“true” />
</android.widget.LinearLayout>
<android.widget.FrameLayout index=“1” package=“com.appname” class=“android.widget.FrameLayout” text="" resource-id=“android:id/contentPanel” checkable=“false” checked=“false” clickable=“false” enabled=“true” focusable=“false” focused=“false” long-clickable=“false” password=“false” scrollable=“false” selected=“false” bounds="[72,1043][964,1175]" displayed=“true”>
<android.widget.ScrollView index=“0” package=“com.appname” class=“android.widget.ScrollView” text="" resource-id=“android:id/scrollView” checkable=“false” checked=“false” clickable=“false” enabled=“true” focusable=“false” focused=“false” long-clickable=“false” password=“false” scrollable=“false” selected=“false” bounds="[72,1043][964,1105]" displayed=“true”>
<android.widget.LinearLayout index=“0” package=“com.appname” class=“android.widget.LinearLayout” text="" checkable=“false” checked=“false” clickable=“false” enabled=“true” focusable=“false” focused=“false” long-clickable=“false” password=“false” scrollable=“false” selected=“false” bounds="[72,1043][964,1105]" displayed=“true”>
<android.widget.TextView index=“0” package=“com.appname” class=“android.widget.TextView” text=“Appointment successfully created !” resource-id=“android:id/message” checkable=“false” checked=“false” clickable=“false” enabled=“true” focusable=“false” focused=“false” long-clickable=“false” password=“false” scrollable=“false” selected=“false” bounds="[72,1043][964,1105]" displayed=“true” />
</android.widget.LinearLayout>
</android.widget.ScrollView>
</android.widget.FrameLayout>
<android.widget.ScrollView index=“2” package=“com.appname” class=“android.widget.ScrollView” text="" resource-id=“android:id/buttonPanel” checkable=“false” checked=“false” clickable=“false” enabled=“true” focusable=“true” focused=“false” long-clickable=“false” password=“false” scrollable=“false” selected=“false” bounds="[72,1175][964,1302]" displayed=“true”>
<android.widget.LinearLayout index=“0” package=“com.appname” class=“android.widget.LinearLayout” text="" checkable=“false” checked=“false” clickable=“false” enabled=“true” focusable=“false” focused=“false” long-clickable=“false” password=“false” scrollable=“false” selected=“false” bounds="[72,1175][964,1302]" displayed=“true”>
<android.widget.Button index=“0” package=“com.appname” class=“android.widget.Button” text=“OK” resource-id=“android:id/button1” checkable=“false” checked=“false” clickable=“true” enabled=“true” focusable=“true” focused=“false” long-clickable=“false” password=“false” scrollable=“false” selected=“false” bounds="[799,1186][964,1302]" displayed=“true” />
</android.widget.LinearLayout>
</android.widget.ScrollView>
</android.widget.LinearLayout>
</android.widget.FrameLayout>
</android.widget.FrameLayout>
</android.widget.FrameLayout>

It could be the alert is a part of another window. In this case changing of enableMultiWindows setting to true might help to see the dialog.

you code does no look much wrong try:

  1. enable on phone in developer menu to show touches - you can see where tap actually happen
  2. try also:
        List<MobileElement> okButton =  driver.findElements(MobileBy.id("android:id/button1"));
        System.out.println("okButton.size(): " + okButton.size()); // check size > 0 = found
        TapOptions tapOptions = new TapOptions().withElement(ElementOption.element(okButton.get(0)));
        new TouchAction(driver).tap(tapOptions).perform();