2017-08-03 12 views
0

私は、Appium、Cucumber-JVMを使用して構築されたフレームワークに取り組んでいます。Cucumber-JVM - Appiumテストで@Afterを実行する際の問題

以下

は、私がappiumドライバをインスタンス化方法についての抜粋です。

 private WebDriverFactory() { 
    } 

    /** 
    * Gets the factory instance. 
    * 
    * @return 
    */ 
    public static WebDriverFactory getInstance() { 
     if (factory == null) 
      factory = new WebDriverFactory(); 
     return factory; 
    } 


    public AppiumDriver getAppiumDriver() throws IOException, NoSuchFieldException { 

     if (appiumDriver == null || !isSessionActive(appiumDriver)) { 


......instantiate driver...... 

}return appiumDriver; 
} 

    */ 
    private boolean isSessionActive(AppiumDriver driver) { 
     return !driver.toString().contains("(null)"); 
//  return driver.getCapabilities()!=null?true:false; 
    } 


    public void closeAppiumDriver() { 
     if ((appiumDriver != null || isSessionActive(appiumDriver))) { 
      appiumDriver.closeApp(); 
      appiumDriver.quit(); 
      if (appiumService != null) 
       if (appiumService.isRunning()) 
        appiumService.stop(); 
     } 
     factory = null; 
     appiumDriver = null; 
    } 

、私のstepDefsでは、私は以下のようにキュウリ@Afterフックを配置しているが、そのが散発的に私にNullpointerexecption

エラーを与えます:java.lang.NullPointerException at appiumdriver.WebDriverFactory.isSessionActive(WebDriverFactory.java:146) at appiumdriver.WebDriverFactory.closeAppiumDriver(WebDriverFactory.java:159) at stepDefs.An droidTestsCommonStepDefs_usingFactory.teardown(AndroidTestsCommonStepDefs_usingFactory.java:140)

@After 
public void embedScreenshot(Scenario scenario) throws IOException, NoSuchFieldException { 
    try { 
     byte[] screenshot = WebDriverFactory.getInstance().getAppiumDriver().getScreenshotAs(OutputType.BYTES); 
     scenario.embed(screenshot, "image/png"); 

    } catch (WebDriverException somePlatformDontsupportSnapshot) { 
     System.err.println(somePlatformDontsupportSnapshot.getMessage()); 
    } 
} 


@After 
public void teardown() throws IOException, NoSuchFieldException { 
    System.out.println("Ran the tearDown."); 
    WebDriverFactory.getInstance().closeAppiumDriver(); 
} 

私はキュウリランナーの内側ティアダウンの上@AfterClassタグ内の()のコードを入れて試してみましたが、それは毎回トリガされていませんでした。また、Cucumber Runnerクラスで@Afterを使用することはできません。

このようなシナリオをどのように扱うか? また、将来、私はテストスイートの一部として、ドライバーに異なるデバイスをインスタンス化して、driver.closeApp()をトリガーしたいかもしれません。 &設定ドライバ= null;私のために重要になるだろう。

親切現在、両方のフックが任意の順序で実行することができた後

おかげ

答えて

0

をお勧めします。したがって、断続的に例外が発生しています。 After注釈のorder属性を使用して、ドライバのクロージャが最後に実行されることを確認する必要があります。

の場合より高いorder属性値が最初に低い値のものよりも先に実行されます。 Beforeアノテーションの反対の振る舞い。

埋め込み方法について、あなたは@After(order=20)を使用すると、ドライバの閉鎖@After(order=10)

+0

確実にすることができます。私はそれを試みます。最終的にこの場所を指しているので、以下のコードでは問題はありませんか?private boolean isSessionActive(AppiumDriver driver){ return!driver.toString()。contains( "(null)"); – user2451016

関連する問題