如何在 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 在应用程序重新启动之间不保持状态