简体   繁体   中英

How to handle App permission pop ups (system popups like device location/contact list) in Appium android tests for OS Marshmallow and above?

PFB the code:

DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.BROWSER_NAME, ""); //Name of mobile web browser to automate. Should be an empty string if automating an app instead.
capabilities.setCapability(CapabilityType.VERSION, "6.0");
capabilities.setCapability(CapabilityType.PLATFORM, "Android");
capabilities.setCapability("deviceName", <deviceID>);
capabilities.setCapability("locationServicesAuthorized", true);
capabilities.setCapability("appPackage",<Package Name for app under test >); //Replace with your app's package  
capabilities.setCapability("appActivity",<Activity Name for app under test >); //Replace with app's Activity
driver = new AndroidDriver<AndroidElement>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);

When the app under test gets launched for the first time, it displays a Location permission popup. The resource id for popup element is: com.android.packageinstaller:id/dialog_container which is outside package of app under test. We are able to detect the elements of App permission pop up using uiAutomatorViewer. But, we are unable to run script using the same element ids as those are not getting detected through the script.

We tried using below code:

**capabilities.setCapability("autoAcceptAlerts", true);**

This is not working.

We have even tried using: driver.switchTo().a‌​lert().accept(); This also is not working.

Any suggestions will be appreciated.

You can use this example to handle app permissions. This is taken from this BLOG POST .

import java.net.MalformedURLException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;

import org.junit.After;
import org.junit.Before;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;



public class WaitTests {

 WebDriver driver;

 @Before
 public void setUp() throws MalformedURLException {

  DesiredCapabilities capabilities = new DesiredCapabilities();
  capabilities.setCapability("deviceName", "XT1562");
  capabilities.setCapability(CapabilityType.BROWSER_NAME, "Android");
  capabilities.setCapability(CapabilityType.VERSION, "6.0.1");
  capabilities.setCapability("platformName", "Android");
  driver = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
  driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);


 }

 @Test
 public void testFirst() {

   alllowAppPermission();
   driver.findElement(By.name("Login")).click();
   driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS); 
}

@After
 public void End() {
  driver.quit();
 }
public void allowAppPermission(){
 while (driver.findElements(MobileBy.xpath("//*[@class='android.widget.Button'][2]")).size()>0) 

 {  driver.findElement(MobileBy.xpath("//*[@class='android.widget.Button'][2]")).click();
 }
}


}

Unfortunately, autoAcceptAlerts works only for iOS.

And, driver.switchTo().a‌​lert().accept(); works only for web view.

I am using Appium Inspector to find elements. The below code work for native app -

WebElement allowButton = driver.findElements(By.xpath("//android.widget.Button[@resource-id='com.android.packageinstaller:id/permission_allow_button'])"));
allowButton.click();

Late post.

You can use below code

capabilities.setCapability(“autoGrantPermissions”, true);

this will grant all permission to app and will not ask for any permissions.

要启用位置,最好的方法是

capabilities.setCapability("gpsEnabled", true);

App Permissions like Location, Storage, Camera etc can be accepted with the capabilities

capabilities.setCapability("autoGrantPermissions", "true");

This will allow all permission "Yes"

Please Note: ensure that "noReset" is "true" in the capabilities.

There are 2 ways

  1. by setting up permission capability as shown below

     capabilities.setCapability(“autoGrantPermissions”, true); 
  2. By using xpath

     public WebElement alertPopup() { ele = driver.findElement(By.xpath("/hierarchy/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.ScrollView/android.widget.LinearLayout")); return ele; } public WebElement okBtnOnAlertPopup() { ele = driver.findElement(By.xpath("/hierarchy/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.ScrollView/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.Button[2]")); return ele; } public void alertPopupIsPresent() { boolean alertPopupDisplayed = alertPopup().isDisplayed(); System.out.println("alertPopupDisplayed - " + alertPopupDisplayed); if(alertPopupDisplayed){ System.out.println("Inside IF"); okBtnOnAlertPopup().click(); } } 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM