2017-05-27 58 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

相关问题