2017-05-31 2 views
0

Ich versuche Frühling in Gurken Selen Projekt zu integrieren.Cucumber Spring PageObjectModel

Projekt ist bereits mit PageObjectModel Design-Muster konfiguriert und funktioniert perfekt vor der Integration mit Spring.

public abstract class BasePage { 

    public WebDriver driver; 


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

    public void verifyPage() { 
     //verify page 
    } 

} 


public class HomePage extends BasePage { 

    @FindBy(how = How.ID, using = "MENU_lINK") 
    private Link MENU_HEADER; 

    public HomePage(WebDriver driver) { 
     super(driver); 
     PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); 
    } 

    public Link getMENU_HEADER() { 
     return MENU_HEADER; 
    } 
} 



public class HomePageSteps { 

    private static final Logger LOGGER = Logger.getLogger(HomePageSteps.class.getName()); 

    private WebDriver driver; 
    HomePage homePage; 
    HelperPage helperPage; 

    public HomePageSteps() { 
     driver = WebDriverProvider.driver; //Driver initiated here 
     homePage = new HomePage(driver); 
    } 

    @Given("I'm on home page") 
    public void navigateToHomePage() { 
     homePage.getMENU_HEADER().click(); 
    } 

Nach der Integration mit Spring-Ausgabe bemerkt, sind alle Funktionen in demselben Browser ausgeführt.

vor dem Frühjahr Integration jedes Merkmal in getrennten Browser auszuführen, verwendet als @After und @Before Anmerkungen verwendet werden, die in Cucumber

public class WebDriverProvider { 
    public static WebDriver driver; 


    @Before 
    public void openBrowser() throws MalformedURLException { 
     System.setProperty("webdriver.chrome.driver", new File(".").getAbsolutePath() + "/drivers/chromedriver.exe"); 
     if (driver != null) driver.quit(); 
     driver = new ChromeDriver(); 
     driver.manage().window().maximize(); 
     driver.manage().timeouts().implicitlyWait(20,TimeUnit.SECONDS); 
    } 


    @After 
    public void embedScreenshot(Scenario scenario) { 
     driver.quit(); 

    } 
} 

Nach der Integration mit Frühling sind in applicationcontext.xml Datei ich den Treiber definiert haben. Ich kann keinen Treiber von @After und @Before Methoden aufrufen und alle Tests werden im selben Browser ausgeführt

Unten ist das Code-Snippet beigefügt.

<bean id="driverProvider" class="com.ecom.utils.DriverProvider" scope="prototype"/> 

<bean id="webDriver" 
     class="org.openqa.selenium.WebDriver" 
     factory-bean="driverProvider" 
     factory-method="getDriver" scope="prototype"/> 


public abstract class BasePage { 

    @Autowired 
    protected WebDriver driver; 


    public void verifyPage() { 
     //verify Page 
    } 

} 

@Component 
public class HomePage extends BasePage { 

    @FindBy(how = How.XPATH, using = "//*[@id='js-siteMainNavigation']//a[@class='qa-Cl_Menu c-site-nav-main-link-1']") 
    private Link MENU_HEADER; 

    public HomePage(WebDriver driver) { 
     PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); 
    } 

    public Link getMENU_HEADER() { 
     return MENU_HEADER; 
    } 
} 

public class HomePageSteps { 

    private static final Logger LOGGER = Logger.getLogger(HomePageSteps.class.getName()); 

    @Autowired 
    HomePage homePage; 


    @When("I navigate to pizza selection page") 
    public void navigateToMenuPage() { 
     homePage.getMENU_HEADER().click(); 
    } 

} 

ich im Aufruf Frühling Bohne von @After und @Before Anmerkungen sieht einen Weg nicht. Ich möchte für jedes Feature einen neuen Browser initiieren.

Ich dachte, Web-Treiber in den Schritten und Pass über die Seiten, aber dafür muss ich definieren einen Konstruktor mit WebDrviver

public HomePage(WebDriver driver) { 
     super(driver); 
     PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); 
    } 

Aber Frühling ist beschweren für eine Bohne damit verbunden erstellen.

Jede Hilfe würde sehr geschätzt werden.

Antwort

2

Warum verwenden Sie Spring, um den Browser zu injizieren? Spring wird sicherstellen, dass dieselbe Instanz, d. H. Derselbe Browser, überall verwendet wird. Das waren Abhängigkeits-Injection-Frameworks.

Verwenden Sie Spring, um Objekte zu injizieren, mit denen Sie den Status zwischen Schritten teilen können, wenn die Schritte in verschiedenen Schrittdefinitionsklassen verwendet werden.

Verwandte Themen