黄瓜 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 注入对象,如果这些步骤用于不同的步骤定义,则允许您在步骤之间共享状态 类。
我正在尝试将 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 注入对象,如果这些步骤用于不同的步骤定义,则允许您在步骤之间共享状态 类。