如何删除实例" driver"来自考试的课程

时间:2017-05-27 20:02:15

标签: java oop selenium selenium-webdriver pageobjects

任何人都可以帮我解决我的问题:

如何从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

谢谢。

2 个答案:

答案 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)

  1. BaseTest删除WebDriver实例。
  2. BaseTest延长BasePage
  3. 像这样:

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