如何在 Appium 的多个测试之间保持登录状态?

How to stay logged in between multiple tests in Appium?

我正在使用 Python、Appium、Android 模拟器测试 Chrome 中的一个网站,并试图找出如何在多个测试之间保持登录状态。我发现的类似问题的最常见答案是添加 --user-data-dir 选项,所以我写了以下内容:

options.add_argument('--user-data-dir=/data/data/com.android.chrome/app_chrome/Profile')

根据 chrome://version 它将配置文件路径更改为 /data/data/com.android.chrome/app_chrome/Profile/Default 但每次创建驱动程序实例时仍然是该目录恢复到默认状态。

回答 one person states that "Chromedriver always starts totally fresh, nothing is keeping" while another person from 确认在 OSX 的情况下“它工作得很好,我不需要再次登录”。

我也遇到了 Appium Reset Strategies 并尝试将以下内容添加到所需的功能中但没有成功:

desired_caps['noReset'] = 'true'
desired_caps['fullReset'] = 'false'

由于您是在与浏览器打交道,因此每次调用 chrome 都会启动一个新的浏览器。 Appium 重置策略仅适用于本机应用程序。

作为一种解决方案,您可以对所有测试使用相同的驱动程序,而不是关闭它们。

每次我们初始化驱动程序时 UserDataDir 在 Android 上消失的原因是因为 chromedriver.exe 在启动浏览器之前运行 adb shell pm clear com.android.chrome 一些语句。

因此,如果您也迫切需要此功能,请按以下方法解决:

  1. 遵循 these instructions 以满足构建 Chromium 的所有要求。由于我们将只构建 chromedriver 而不是 Chromium,因此构建过程不会花费太长时间或需要太多 RAM、CPU 个内核或磁盘 space。

  2. 找出您的 chromedriver 版本:

     $ .\chromedriver.exe --version
     ChromeDriver 91.0.4472.19
    
  3. 相应地更新 Chromium 源代码:

     $ git checkout -b fix_clear_app_data 91.0.4472.19
     $ gclient sync
    
  4. 注释掉 chromedriver/chrome/device_manager.cc 的 Device::SetUp 方法中的以下行:

     // status = adb_->ClearAppData(serial_, package);
     // if (status.IsError())
     //    return status;
    
  5. 确保构建 release version,否则您将无法从构建目录中单独移动 chromedriver.exe。

  6. 构建 chromedriver:

     $ autoninja -C out/Default chromedriver
    
  7. 将out\Default\chromedriver.exe复制到合适的位置并将其位置传递给appium:

     $ appium --chromedriver-executable /path/to/chromedriver.exe
    

补充一下,大约 4 个月前 flag was added 到 chromedriver,它允许您防止清除名为“androidKeepAppDataDir”的应用程序数据目录.

当设置你想要的上限时,这对我有用,它从 运行 adb shell pm clear 命令停止 chromedriver:

    DesiredCapabilities appCapabilities = new DesiredCapabilities();
    appCapabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
    appCapabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, "UiAutomator2");
    appCapabilities.setCapability(MobileCapabilityType.NO_RESET, true);
    appCapabilities.setCapability(MobileCapabilityType.BROWSER_NAME, "chrome");
    ChromeOptions options = new ChromeOptions();
    options.setExperimentalOption("androidKeepAppDataDir", true);
    appCapabilities.setCapability(ChromeOptions.CAPABILITY, options);