appium chrome浏览器的文件下载权限

时间:2019-04-12 13:31:16

标签: selenium-chromedriver appium appium-android saucelabs

我正在使用chrome浏览器加载网址的远程android驱动程序上实现appium测试。 有些Urls是pdf,而chrome要求存储这些文件。并显示chrome无法访问文件系统来存储这些文件,这将导致如下所示的对话框。

请帮助我通过该对话框,而无需任何手动输入。

File permission dialog

单击continue后,它将从Android加载实际权限对话框。

这是我的代码初始化appium功能

DesiredCapabilities caps = DesiredCapabilities.android();
    caps.setCapability("appiumVersion", "1.9.1");
    caps.setCapability("deviceName","Samsung Galaxy S9 Plus HD GoogleAPI Emulator");
    caps.setCapability("deviceOrientation", "portrait");
    caps.setCapability("browserName", "Chrome");
    caps.setCapability("platformVersion", "8.1");
    caps.setCapability("platformName","Android");
    caps.setCapability("autoAcceptAlerts", true);
    caps.setCapability("autoGrantPermissions", true);
    caps.setCapability("chromedriverArgs", "--allow-file-access-from-files");
    caps.setCapability("maxDuration", 10000);

这是我用来加载网址的代码段

        driver.navigate().to("http://kmmc.in/wp-content/uploads/2014/01/lesson2.pdf");

autoGrantPermission在这种情况下也不起作用,因为已经安装了chrome。 Appium团队已经拒绝了此问题- https://github.com/appium/appium/issues/10008

请帮助!

1 个答案:

答案 0 :(得分:1)

确实,我很难找到解决方案,但最终我找到了解决方法。

  • 最好的解决方法是重新安装chrome程序包。我试过了,但是重新安装chrome后我无法启动,因为我无法访问shell,而chromedriver抱怨。所以我离开了那条路。
  • 我尝试抓住adb命令或mobile:changePermissions,但是为此,您需要在启动服务器时使用服务器标志--relaxed-security,saucelabs不提供任何方便的界面来启动服务器带有这个标志。

不得已,我在这里找到了解决方案-https://stackoverflow.com/a/51241899/4675277。但这还不够,因为它帮助我修复了chrome警报,但随后又弹出了另一个警报,分别为allowdeny,对此问题的另一个解决方案也为我提供了帮助。这就是我最终使用的代码-

driver.navigate().to("http://kmmc.in/wp-content/uploads/2014/01/lesson2.pdf");
    String webContext = ((AndroidDriver)driver).getContext();
    Set<String> contexts = ((AndroidDriver)driver).getContextHandles();
    for (String context: contexts){
        if (context.contains("NATIVE_APP")){
            ((AndroidDriver)driver).context(context);
            break;
        }
    }
    driver.findElement(By.id("android:id/button1")).click();
    contexts = ((AndroidDriver)driver).getContextHandles();
    for (String context: contexts){
        if (context.contains("NATIVE_APP")){
            ((AndroidDriver)driver).context(context);
            break;
        }
    }
    driver.findElement(By.id("com.android.packageinstaller:id/permission_allow_button")).click();
    ((AndroidDriver)driver).context(webContext);

这有助于允许所有必需的权限。

相关问题