2017-08-03 21 views
0

我正在使用Appium,Cucumber-JVM構建的框架上工作。問題在Cucumber-JVM中執行@After - Appium測試

下面是我如何實例化一個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屬性來確保最後執行驅動程序關閉。

如果在較低的值之前先執行較高的訂單屬性值之後執行。註釋之前的相反行爲。

插入一個方法,你可以使用@After(order=20)和驅動程序關閉@After(order=10)

+0

肯定。我會嘗試。但是你是否在下面的代碼中看到了任何問題,因爲它最終指向這個地方:private boolean isSessionActive(AppiumDriver driver){return; driver.toString()。contains(「(null)」); – user2451016