黄瓜 Spring PageObjectModel

Cucumber Spring PageObjectModel

我正在尝试将 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 的方法。 我想为每个功能启动一个全新的浏览器。

我想在 Steps 和 Pass across Pages 中创建 Web Driver,但为此我必须用 WebDrviver 定义一个构造函数

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

但是 Spring 抱怨与此关联的 bean。

非常感谢任何帮助。

为什么要使用 Spring 注入浏览器? Spring 将确保在所有地方都使用相同的实例,即相同的浏览器。那是依赖注入框架所做的。

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