任何人都可以帮我解决我的问题:
如何从driver
课程中删除实例BaseTest
,但在此处和儿童课程中使用它?
我使用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();
}
}
}
这个问题已经出现,因为我在课程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);
}
}
我想从driver
类删除实例BaseTest
,但将其留在课程BasePage
中。所以我在Project中只留下一个driver
实例。我的测试只会知道测试的逻辑,但不会知道具体的实现(例如在当前时间它是硒,但将来有可能是selenide或其他工具)。
也许我必须创建新类Webdriver并在内部创建静态实例driver
和方法getter()我可以使用它?或者另一种方式?在这种情况下,我不知道哪种方式更好,而且在OOP原则方面更正确。
您可以在此处找到的完整项目 - TestGoogle on GitHub
谢谢。
答案 0 :(得分:2)
我通常做的是拥有@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
int size = Math.min(width, height);
setMeasuredDimension(size, size);
}
静态对象,该对象具有驱动程序设置和拆卸(全部静态)。它还有一个静态驱动程序实例和一个静态getter。
test和page对象都可以调用DriverManager.getDriver()。在您的系统中,测试对象也会从自己的setup / teardown中调用DriverManager setup / teardown。关于驱动程序细节的所有问题都会进入DriverManager。任何与驱动程序相关的实用程序(如自定义等待)也会在那里。
有些人对静态物体皱眉。但你也可以使DriverManager成为单身人士:
DriverManager
首次引用类时会初始化静态字段。
答案 1 :(得分:0)
BaseTest
删除WebDriver实例。BaseTest
延长BasePage
。像这样:
public class BaseTest extends BasePage {
protected WebDriver getDriver() {
return driver;
}
//...
}