如何在场景之前让 Appium 干净的应用程序

How to make Appium clean app before scenario

我将 Appium 与 JUnit 一起使用。还有Cucumber,不过他家的不应该干涉这里。

我需要在每个案例中安装清晰的应用程序,使它们真正独立。我使用以下 IOSDriver 设置:

    public static void initDriver(boolean noReset) throws MalformedURLException {
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("deviceName", "iPhone 4s");
        capabilities.setCapability("noReset", noReset);
        capabilities.setCapability("autoAcceptAlerts",true);
        driver = new IOSDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
    }

   public void quitDriver() {
        driver.executeScript("au.backgroundApp(0)");
        driver.quit();
        driver = null;
    }

@问题前

我所做的是在每个案例之前检查是否安装了该应用程序,如果是,则重新安装。不幸的是,当我卸载应用程序时,会话中断并且测试用例失败。

编辑: initDriver() 方法会导致驱动程序自动启动并安装应用程序,因此即使未安装应用程序,也会执行此 if(isAppInstalled) 部分以前的设备。

     @Before
        public void beforeScenario() throws MalformedURLException {
            initDriver(false);
            if(IosConfig.getDriver().isAppInstalled(StringConfiguration.getiOSappBundleId())) {
                System.out.println("THE APP IS INSTALLED. UNINSTALLING...");
                IosConfig.getDriver().removeApp(StringConfiguration.getiOSappBundleId());
            }
       }

@问题解决后

另外,我的@After部分没有执行,所以case之后app没有卸载...

@After
    public void tearDown(Scenario scenario) {
        try {
            if(scenario.isFailed()) {
                final byte[] screenshot = IosConfig.getDriver().getScreenshotAs(OutputType.BYTES);
                scenario.embed(screenshot, "image/png");
                IosConfig.getDriver().closeApp();
          IosConfig.getDriver().removeApp(StringConfiguration.getiOSappBundleId());
            }
        } finally {
            IosConfig.getDriver().closeApp();
         IosConfig.getDriver().removeApp(StringConfiguration.getiOSappBundleId());
            quitDriver();

        }
    }

请帮忙!

"After" 部分的问题已解决。

我也使用 Cucumber,我错误地导入了 org.junit.After 而不是 cucumber.api.java.After!那个好难找。

  1. 在@Aftermethod 中你可以调用driver.resetApp()

    @AfterMethod public void resetApp(){ 如果(空!= driver){ driver.resetApp(); } }

  2. 如果这对您不起作用,请在功能中使用 fullReset = true