java - driver.quit() 后如何不关闭应用程序
问题描述
我正在使用 Appium 安装应用程序。安装后,应用程序应该在后台运行。当应用程序在后台运行时,另一个测试应该使用 Chrome 来检查 Internet 连接。问题是 driver.quit() 甚至启动 AndroidDriver 的新实例都会杀死应用程序,并且它不再在后台运行。有没有办法在安装的应用程序仍在后台运行时测试 Chrome?
public class test {
public static void main(String[] args) throws MalformedURLException, InterruptedException {
AndroidDriver<MobileElement> driver;
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, "");
capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Xiaomi A2 Lite");
capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "9");
capabilities.setCapability(MobileCapabilityType.APPLICATION_NAME, "Android");
capabilities.setCapability(MobileCapabilityType.CLEAR_SYSTEM_FILES, "false");
capabilities.setCapability(MobileCapabilityType.NO_RESET, "true");
capabilities.setCapability(MobileCapabilityType.FULL_RESET, "false");
capabilities.setCapability("appPackage", "com.waze");
capabilities.setCapability("appActivity", "com.waze.FreeMapAppActivity");
driver = new AndroidDriver<MobileElement>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
Thread.sleep(5000);
DesiredCapabilities capabilities2 = new DesiredCapabilities();
capabilities2.setCapability(MobileCapabilityType.BROWSER_NAME, "Chrome");
capabilities2.setCapability(MobileCapabilityType.DEVICE_NAME, "Xiaomi A2 Lite");
capabilities2.setCapability(MobileCapabilityType.PLATFORM_VERSION, "9");
capabilities2.setCapability(MobileCapabilityType.APPLICATION_NAME, "Android");
AndroidDriver<MobileElement> driver2;
driver2 = new AndroidDriver<MobileElement>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities2);
driver2.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
driver2.get("http://google.com");
MobileElement googleLogo=(MobileElement) driver2.findElement(MobileBy.id("hplogo"));
Assert.assertEquals(googleLogo.isDisplayed(), true);
}
}
解决方案
你可以想出一个实现Callable接口的示例类:
import io.appium.java_client.AppiumDriver;
import java.time.Duration;
import java.util.concurrent.Callable;
public class BackgroundThread implements Callable {
AppiumDriver driver;
Duration duration;
public BackgroundThread(AppiumDriver driver, Duration duration) {
this.driver = driver;
this.duration = duration;
}
@Override
public Object call() {
driver.runAppInBackground(duration);
return "Slept for " + duration.toString();
}
}
当您需要将应用程序发送到后台并在后台执行其他操作时 - 使用ExecutorService调用它:
ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<Object> result = executorService.submit(new BackgroundThread(driver, Duration.ofSeconds(60)));
您可能还会发现DeviceAction命令很有用,例如您可以模拟“主页”按钮单击,这会将应用程序发送到后台并立即返回上下文。
推荐阅读
- r - 将多年期分成几行一年
- angular - Angular 中 Auth0 文件的单元测试
- java - 类的引用/实例如何在打字稿中工作
- node.js - 将 Google 幻灯片演示文稿移至其他用户的驱动器
- javascript - 使用 javascript 即时更改视频并使用引导程序在浮动窗口上播放
- google-cloud-platform - 如何在 Bigquery UDF 中将函数作为参数传递?
- javascript - 访问子域和主域下的同一目录时内容不同
- elixir - 凤凰城 - 一对一的关系
- r - 如何使用观察事件或 R Shiny 中的其他反应函数更改表列标题?
- python - 模型拟合中的 keras 错误 ValueError:形状 (32, 147) 和 (32, 2) 不兼容