如何在 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
一些语句。
因此,如果您也迫切需要此功能,请按以下方法解决:
遵循 these instructions 以满足构建 Chromium 的所有要求。由于我们将只构建 chromedriver 而不是 Chromium,因此构建过程不会花费太长时间或需要太多 RAM、CPU 个内核或磁盘 space。
找出您的 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
将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);
我正在使用 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 Reset Strategies 并尝试将以下内容添加到所需的功能中但没有成功:
desired_caps['noReset'] = 'true'
desired_caps['fullReset'] = 'false'
由于您是在与浏览器打交道,因此每次调用 chrome 都会启动一个新的浏览器。 Appium 重置策略仅适用于本机应用程序。
作为一种解决方案,您可以对所有测试使用相同的驱动程序,而不是关闭它们。
每次我们初始化驱动程序时 UserDataDir 在 Android 上消失的原因是因为 chromedriver.exe 在启动浏览器之前运行 adb shell pm clear com.android.chrome
一些语句。
因此,如果您也迫切需要此功能,请按以下方法解决:
遵循 these instructions 以满足构建 Chromium 的所有要求。由于我们将只构建 chromedriver 而不是 Chromium,因此构建过程不会花费太长时间或需要太多 RAM、CPU 个内核或磁盘 space。
找出您的 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
将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);