【问题标题】:WebDriver is not being instantiated in Cucumber testsWebDriver 未在 Cucumber 测试中实例化
【发布时间】:2016-07-19 15:25:36
【问题描述】:

我正在尝试实例化 WebDriver 的单个实例以在某些测试中使用,这样做可能会过于复杂。我想我只需要实例化一个静态网络驱动程序,然后为每个功能文件重复使用一次,假设这是可能的。

我不清楚为什么没有实例化驱动程序。我正在尝试通过从 IDE(intelliJ)中的功能文件运行来进行调试。我期望驱动程序在调用 Super 时进行实例化。

步骤定义:

public class FindAHolidayStepDefs extends DriverBase {

private HolidaysHomePage tcHomePage;
private SearchResultsPage searchPage;

@Before //this is the cucumber @Before
public void setup(){
    holHomePage = new HolidaysHomePage(driver);
    searchPage = new SearchResultsPage(driver);
}

@Given("^I am on the Holidays homepage$")
public void IAmOnTheHolidaysHomepage() {
    assertEquals("the wrong page title was displayed !", "Cheap Travel\u00ae : Cheap Holidays & Last Minute Package Deals", holHomePage.getTitle());
} // more step defs below...

页面对象:

public class HolidaysHomePage extends SeleniumBase {

public HolidaysHomePage(WebDriver driver) {

    super(driver);  //Expecting driver to instantiate here
    visit("");
    driver.manage().window().maximize();
    assertTrue("The Holidays header logo is not present",
            isDisplayed(headerLogo));
}

//code...

驱动程序库:

public class DriverBase implements Config {

protected WebDriver driver;

    @Before //this is the Junit @Before
    public void before() throws Throwable {
        if (host.equals("localhost")) {
            switch (browser) {
                case "firefox":
                    driver = new FirefoxDriver();
                    break;
                case "chrome":
                    System.setProperty("webdriver.chrome.driver",
                            System.getProperty("user.dir") + "\\drivers\\chromedriver.exe");
                    driver = new ChromeDriver();
                    break;
            }
        }
    }

    @After
    public void after() {
        driver.quit();
    }

};

SeleniumBase(只是一个抽象出 Selenium API 方法的类)

public class SeleniumBase implements Config {

public WebDriver driver;

public SeleniumBase(WebDriver driver) {
    this.driver = driver;
}

public void visit(String url) {
    if (url.contains("http"))  {
        driver.get(url);
    } else {
        driver.get(baseUrl + url);
    }
}

配置:

public interface Config {

final String baseUrl = System.getProperty("baseUrl", "http://holidaystest.co.uk/");
final String browser = System.getProperty("browser", "chrome");
final String host = System.getProperty("host", "localhost");

}

【问题讨论】:

    标签: java selenium junit webdriver cucumber


    【解决方案1】:

    根据您的代码,以下是我的建议:

    1. 您不需要有 DriverBase 类,因为您已经创建了 SeleniumBase
    2. 将下面的驱动初始化代码移动到FindAHolidayStepDefs中的setup()方法中
    3. FindAHolidayStepDefs 应该扩展 SeleniumBase

      if (host.equals("localhost")) { switch (browser) { case "firefox": driver = new FirefoxDriver(); break; case "chrome": System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir") + "\\drivers\\chromedriver.exe"); driver = new ChromeDriver(); break; } }

    【讨论】:

    • 感谢 cmets,1. DriverBase 用于驱动程序管理,SeleniumBase 是对 selenium 函数的抽象:两者都有其目的,我不明白为什么要更改它 2. 我不想要我的步骤定义中的驱动程序管理代码 - 我希望在页面对象级别进行驱动程序实例化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多