2017-05-27 91 views
0

任何人可以幫助我與我的問題:如何從測試的類中刪除實例「驅動程序」

如何從BaseTest類中刪除實例driver但在這裏,在兒童類使用它?

我使用POM通過Selenium + TestNG + Maven構建測試框架。
比如我有未來BaseTest類:

package com.google.test; 

import java.util.concurrent.TimeUnit; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.openqa.selenium.remote.DesiredCapabilities; 
import org.testng.annotations.AfterTest; 
import org.testng.annotations.BeforeTest; 

public class BaseTest { 

    protected WebDriver driver; 

    protected WebDriver getDriver() { 
     return driver; 
    } 

    @BeforeTest 
    public void setUp() { 
     if (driver == null) { 
      initializeDriver(); 
      setPropertyWindow(); 
      setPropertyTimeOut(); 
     } 
    } 

    @AfterTest 
    public void tearDown() { 
     delay(3000); 
     if (driver != null) { 
      driver.close(); 
     } 
    } 

    public void initializeDriver() { 
     DesiredCapabilities capabilitiesFirefox = new DesiredCapabilities(); 
     capabilitiesFirefox.setCapability("marionette", true); 
     System.setProperty("webdriver.gecko.driver", "e:\\Autotests\\TestGoogle\\src\\test\\resources\\Geckodriver 0.16.1\\geckodriver.exe"); 
     driver = new FirefoxDriver(capabilitiesFirefox); 
    } 

    public void setPropertyWindow() { 
     driver.manage().window().maximize(); 
    } 

    public void setPropertyTimeOut() { 
     driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 
    } 

    public void delay (long millisec) { 
     try { 
      Thread.sleep(millisec); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

這個問題已經出現becouse我有BasePage類多了一個實例驅動程序:

package com.google.pages; 

import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.support.PageFactory; 
import org.openqa.selenium.support.ui.ExpectedCondition; 
import org.openqa.selenium.support.ui.WebDriverWait; 

public class BasePage { 

    public static final String BASE_URL = "https://www.google.com/ncr"; 
    protected WebDriver driver; 
    protected static final int TIME_OUT = 10; 

    protected WebDriver getDriver() { 
     return driver; 
    } 

    public BasePage(WebDriver driver) { 
     this.driver = driver; 
     PageFactory.initElements(driver, this); 
    } 

    public WebElement assertThat(ExpectedCondition<WebElement> condition) { 
     return (new WebDriverWait(driver, TIME_OUT)).until(condition); 
    } 
} 

我想從BaseTest類中刪除實例driver但離開它在類BasePage。因此,我只在項目中留下driver的一個實例。我的測試只知道測試的邏輯,但不知道具體的實現(例如在當前時間是硒,但將來可能會有硒化或其他工具)。
也許我必須創建新的類Webdriver和內部創建靜態實例driver和方法getter()我可以使用?或者另一種方式?我不明白在這種情況下哪種方式更好,更重要的是使用點OOP原則。

完整的項目,你可以在這裏找到 - TestGoogle on GitHub

謝謝。

回答

0
  1. BaseTest中刪除WebDriver實例。
  2. 品牌BaseTest延伸BasePage

像這樣:

public class BaseTest extends BasePage { 
    protected WebDriver getDriver() { 
     return driver; 
    } 
    //... 
} 
+0

不,不,不。你如何想象它 - 從'Pages'繼承'Tests'?邏輯在哪裏?頁面對象模式的本質 - 分離邏輯。這個變體對於物理實現問題是非常容易的(簡單的語法和不再),但我試圖解決邏輯實現這個問題。 – PrinceOFF

2

我最常做的是有一個具有驅動的安裝和拆卸(所有靜態)一個DriverManager靜態對象。它也有一個靜態的驅動實例和一個靜態的getter。

測試和頁面對象都可以調用DriverManager.getDriver()。在你的系統中,測試對象也會從它自己的setup/teardown調用DriverManager setup/teardown。所有關於驅動程序細節的問題都進入了DriverManager。任何與驅動程序相關的實用程序(如自定義等待)也都會去那裏。

有些人對靜態物體皺眉。但是你也可以使DriverManager成爲一個單獨的文件:

static private final instance = new DriverManager(); 

static public DriverManager getInstance() { 
    return instance; 
} 

靜態字段在首次引用類時被初始化。

+0

你建議在這裏使用Singleton的哪個實現?例如,爲了同時使用啓動多重測試? – PrinceOFF

+0

我不會在一個項目中同時進行多項測試 - 我傾向於在瀏覽器窗口完全覆蓋時發現問題,儘管理論上這應該起作用。所以我可以用'靜態專用DriverManager實例'完成一個通常的單例。對於多個測試同時,我可能會有一個DriverManager實例存儲在測試對象中。然後從測試對象中創建頁面對象 - 因此測試對象的實例將是主控。 –

+0

不太明白。你有沒有這種認識的例子? – PrinceOFF

相關問題