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

标签 selenium-chromedriver appium appium-android saucelabs

我正在远程 android 驱动程序上实现 appium 测试,使用 chrome 浏览器加载 url。
一些 URL 是 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);

这是我用来加载 Url 的片段
        driver.navigate().to("http://kmmc.in/wp-content/uploads/2014/01/lesson2.pdf");
autoGrantPermission在这种情况下也不起作用,因为已经安装了 chrome。 Appium 团队已经拒绝了这个问题——
https://github.com/appium/appium/issues/10008

请帮忙!

最佳答案

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

  • 最好的解决方法是重新安装 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);
    

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

    关于selenium-chromedriver - appium chrome浏览器的文件下载权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55652810/

    相关文章:

    ios - 在 iOS 上使用 Appium 生成代码覆盖率

    java - Appium问题。如果 "listen eaddrinuse: address already in use",如何阻止它?为什么它没有停止?

    ruby-on-rails - ChromeDriver/菠菜/ Selenium 错误 : Failed to read the 'localStorage' property from 'Window' : Storage is disabled inside 'data:' URLs

    python - 如何在一段时间没有事件后禁用 Selenium Chrome 驱动程序的自动关闭操作?

    selenium - 如何通过命令行停止appium服务器?

    javascript - 如何在多个设备上并行运行测试?

    java - 无法将按键发送到输入元素

    javascript - 如何在 Selenium Python 中处理模态框或弹出框

    c# - 如何以 headless 模式启动 ChromeDriver

    appium - 返回值无法转换为 WebElement