如何从测试的类中删除实例“驱动程序”
问题描述:
任何人可以帮助我与我的问题:如何从测试的类中删除实例“驱动程序”
如何从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
谢谢。
答
- 从
BaseTest
中删除WebDriver实例。 - 品牌
BaseTest
延伸BasePage
。
像这样:
public class BaseTest extends BasePage {
protected WebDriver getDriver() {
return driver;
}
//...
}
答
我最常做的是有一个具有驱动的安装和拆卸(所有静态)一个DriverManager
静态对象。它也有一个静态的驱动实例和一个静态的getter。
测试和页面对象都可以调用DriverManager.getDriver()。在你的系统中,测试对象也会从它自己的setup/teardown调用DriverManager setup/teardown。所有关于驱动程序细节的问题都进入了DriverManager。任何与驱动程序相关的实用程序(如自定义等待)也都会去那里。
有些人对静态物体皱眉。但是你也可以使DriverManager成为一个单独的文件:
static private final instance = new DriverManager();
static public DriverManager getInstance() {
return instance;
}
静态字段在首次引用类时被初始化。
不,不,不。你如何想象它 - 从'Pages'继承'Tests'?逻辑在哪里?页面对象模式的本质 - 分离逻辑。这个变体对于物理实现问题是非常容易的(简单的语法和不再),但我试图解决逻辑实现这个问题。 – PrinceOFF