2016-07-19 9 views
1

Ich versuche, eine einzelne Instanz von WebDriver in einigen Tests zu instanziieren, und dabei habe ich möglicherweise zu kompliziert. Ich denke, ich muss nur einen statischen Webdriver instantiieren und dann für jede Feature-Datei einmal verwenden, vorausgesetzt, das ist möglich.WebDriver wird nicht in Cucumber-Tests instanziiert

Ich bin nicht klar, warum der Treiber nicht instanziiert wird. Ich versuche, zu debuggen, indem ich von Feature-Datei in der IDE (intelliJ) ausführe. Ich erwarte, dass der Fahrer instanziiert, wenn Super aufgerufen wird.

Schritt Defs:

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... 

Pageobject:

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... 

DriverBase:

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 (nur eine Klasse mit Selen API-Methoden abstrahiert out)

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); 
    } 
} 

Config:

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"); 

}

Antwort

0

Basierend auf Ihren Code, hier sind meine Vorschläge:

  1. Sie brauchen keine DriverBase Klasse haben, wie Sie bereits eine SeleniumBase Klasse erstellt
  2. Verschieben Sie den folgenden Treiberinitialisierungscode auf setup() - Methode in FindAHolidayStepDefs
  3. FindAHolidayStepDefs SeleniumBase verlängern sollte

    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; } }

+0

Dank für die Kommentare, 1. DriverBase für Treiber-Management, ist SeleniumBase Abstraktion von Selen Funktionen: sowohl ihren Zweck haben, und ich sehe nicht, warum ich sollte dies ändern 2. Ich möchte nicht Fahrer-Management-Code in meinem Schritt defs - Ich möchte Treiberinstanziierung auf der Seite-Objekt-Ebene – Steerpike

Verwandte Themen