如何在OS Marshmallow及以上的Appium android测试中处理App权限弹出窗口(系统弹出窗口,如设备位置/联系人列表)?

时间:2016-08-16 14:31:56

标签: java selenium appium

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);

首次启动测试中的应用时,会显示“位置”权限弹出窗口。 弹出元素的资源ID是: com.android.packageinstaller:ID / dialog_container ,这是受测试的应用程序包的外包。 我们可以使用uiAutomatorViewer检测弹出App权限的元素。 但是,我们无法使用相同的元素ID运行脚本,因为没有通过脚本检测到这些元素。

我们尝试使用以下代码:

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

这不起作用。

我们甚至尝试过使用: 的 driver.switchTo()一个lert()接受(); 这也行不通。

任何建议都将受到赞赏。

6 个答案:

答案 0 :(得分:1)

您可以使用此示例来处理应用程序权限。这取自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();
 }
}


}

答案 1 :(得分:0)

不幸的是,autoAcceptAlerts仅适用于iOS。

并且,driver.switchTo()。一个lert()。accept();仅适用于Web视图。

我正在使用Appium Inspector来查找元素。以下代码适用于本机应用程序 -

detach()

答案 2 :(得分:0)

最新帖子。

您可以使用以下代码

capabilities.setCapability(“autoGrantPermissions”, true);

这将授予应用程序所有权限,并且不会要求任何权限。

答案 3 :(得分:0)

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

select customer.id as cus_id,customer.name as cus_name,purchase.id as latest_purchase_id
from customer
 join purchase
 on customer.id=purchase.customer_id
 where purchase.id=(select id
from purchase p1
where year = ( select max(year)
              from purchase p2
              where p1.customer_id=p2.customer_id))
         ;

答案 4 :(得分:0)

该功能可以接受位置,存储,摄像头等应用程序权限

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

这将允许所有权限“是”

请注意:确保功能中的“ noReset”为“ true”。

答案 5 :(得分:0)

有2种方法

  1. 通过设置如下所示的权限功能

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