Cucumber Spring PageObjectModel

时间:2017-05-31 20:49:26

标签: spring selenium-webdriver cucumber pageobjects

我正在尝试将Spring整合到Cucumber Selenium项目中。

项目已经配置了PageObjectModel设计模式,并且在与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();
    }

与Spring集成后,注意到所有功能都在同一个浏览器中执行。

在Spring集成之前,用于在分离的浏览器中执行的每个功能都使用Cucumber中可用的@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文件中与Spring集成后,我定义了驱动程序。我无法从@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的方法。 我想为每个功能启动一个全新的浏览器。

我想在步骤中创建Web驱动程序并通过页面,但为此我必须使用WebDrviver定义构造函数

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

但是Spring抱怨与之相关的bean。

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

为什么使用Spring注入浏览器? Spring将确保在任何地方使用相同的实例,即相同的浏览器。这就是依赖注入框架。

如果步骤在不同的步骤定义类中使用,则使用Spring注入允许您在步骤之间共享状态的对象。