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

Posted

技术标签:

【中文标题】如何在 Appium 的多个测试之间保持登录状态?【英文标题】:How to stay logged in between multiple tests in Appium? 【发布时间】:2021-10-12 05:11:37 【问题描述】:

我正在使用 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,但每次创建驱动程序实例时,该目录仍会恢复为其默认状态。

回答Appium - running browser tests without clearing browser data 的一个人说“Chromedriver 总是以全新的方式启动,没有任何东西保留”,而来自Using selenium: How to keep logged in after closing Driver in Python 的另一个人确认在 OSX 的情况下“它工作得非常好,我不需要再次登录” .

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

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

【问题讨论】:

【参考方案1】:

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

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

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

    找出您的 chromedriver 版本:

     $ .\chromedriver.exe --version
     ChromeDriver 91.0.4472.19
    

    相应地更新 Chromium 源代码:

     $ git checkout -b fix_clear_app_data 91.0.4472.19
     $ gclient sync
    

    注释掉chromedriver/chrome/device_manager.cc的Device::SetUp方法中的以下几行:

     // status = adb_->ClearAppData(serial_, package);
     // if (status.IsError())
     //    return status;
    

    确保构建 release version 否则您将无法从构建目录中自行移动 chromedriver.exe。

    构建 chromedriver:

     $ autoninja -C out/Default chromedriver
    

    将\Default\chromedriver.exe 复制到适当的位置并将其位置传递给appium:

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

【讨论】:

【参考方案2】:

由于您正在处理浏览器,因此每次调用 chrome 都会启动一个新浏览器。 Appium 重置策略仅适用于原生应用。

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

【讨论】:

【参考方案3】:

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

设置所需的上限时,这对我有用,它会阻止 chromedriver 运行 adb shell pm clear 命令:

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

【讨论】:

以上是关于如何在 Appium 的多个测试之间保持登录状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过浏览器登录在 Android 上自动化 appium 测试?

StateNotifierProvider 在应用程序重新启动之间不保持状态

在组件之间路由时如何保持 React 新的 Context API 状态?

接口测试之保持登录状态

appium自动化测试框架——自动化启动多台设备思路梳理

Appium:如何一个接一个地执行多个测试用例?