2017-05-31 94 views
0

我正在嘗試將Spring集成到Cucumber Selenium項目中。黃瓜春季PageObjectModel

在與Spring集成之前,項目已經配置了PageObjectModel設計模式並完美工作。

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

與Spring問題集成後注意到所有功能都在同一個瀏覽器中執行。

Spring集成之前用於分離瀏覽器中執行的@After@Before註釋每個功能所使用的是黃瓜

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

    } 
} 

提供經過整合與春天applicationcontext.xml文件我已經定義的驅動程序。我無法撥打@After@Before方法的驅動程序,並且所有測試都在同一瀏覽器中執行。

下面是附加的代碼片段。

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

} 

我沒有看到從@After@Before註釋調用Spring bean的一種方式。 我想爲每個功能啓動全新的瀏覽器。

我認爲創建步驟捲筒紙驅動器,並在頁面之間傳遞,但爲了這個,我必須定義與WebDrviver

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

一個構造函數,但春天是抱怨關聯到這一個bean。

任何幫助將不勝感激。

回答

2

爲什麼你使用Spring來注入瀏覽器? Spring將確保在任何地方都使用相同的實例,即相同的瀏覽器。那是依賴注入框架呢。

如果這些步驟在不同的步驟定義類中使用,則使用Spring注入對象以允許您在步驟之間共享狀態。