简体   繁体   English

如何处理适用于OS Marshmallow及更高版本的Appium android测试中的App权限弹出窗口(系统弹出窗口,例如设备位置/联系人列表)?

[英]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: PFB代码:

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. 弹出元素的资源ID为:com.android.packageinstaller:id / dialog_container ,它在被测试应用程序的外部。 We are able to detect the elements of App permission pop up using uiAutomatorViewer. 我们能够检测到使用uiAutomatorViewer弹出的“应用程序”权限的元素。 But, we are unable to run script using the same element ids as those are not getting detected through the script. 但是,我们无法使用与未通过脚本检测到的元素ID相同的元素ID来运行脚本。

We tried using below code: 我们尝试使用以下代码:

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

This is not working. 这是行不通的。

We have even tried using: driver.switchTo().a‌​lert().accept(); 我们甚至尝试过使用: 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 . 这取自此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. 不幸的是,autoAcceptAlerts仅适用于iOS。

And, driver.switchTo().a‌​lert().accept(); 并且,driver.switchTo()。a‌lert()。accept(); works only for web view. 仅适用于网络视图。

I am using Appium Inspector to find elements. 我正在使用Appium Inspector查找元素。 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. 请注意:确保功能中的“ noReset”为“ true”。

There are 2 ways 有2种方法

  1. by setting up permission capability as shown below 通过设置如下所示的权限功能

     capabilities.setCapability(“autoGrantPermissions”, true); 
  2. By using xpath 通过使用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(); } } 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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