【问题标题】:Permission issue for appium chrome borwserappium chrome浏览器的文件下载权限
【发布时间】:2019-09-03 06:55:39
【问题描述】:

我正在远程 android 驱动程序上实现 appium 测试,使用 chrome 浏览器加载 url。 一些 Url 是 pdf,chrome 要求存储这些文件。并且似乎 chrome 无权访问文件系统来存储这些文件,这会导致如下所示的对话框。

请帮助我在没有任何手动输入的情况下通过该对话框。

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

这是我用来加载 Url 的 sn-p

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

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

请帮忙!

【问题讨论】:

  • 进入设备设置>应用>Chrome>权限并允许存储权限。这应该有效。
  • 没有物理设备。我使用 saucelabs 服务即时创建设备
  • 假设您为这项服务向 SauceLabs 付费,他们应该能够为您提供答案。我敢肯定这不是客户第一次需要这样做。快速搜索他们的文档让我相信你需要使用真实的设备。我没有使用过 S-Labs,但我假设您在设置时可以在真实或模拟的云设备之间进行选择。

标签: selenium-chromedriver appium appium-android saucelabs


【解决方案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);

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

【讨论】:

    猜你喜欢
    • 2019-02-09
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 2014-10-27
    • 2018-11-05
    • 1970-01-01
    相关资源
    最近更新 更多