我正在尝试将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。
任何帮助都将受到高度赞赏。
答案 0 :(得分:2)
为什么使用Spring注入浏览器? Spring将确保在任何地方使用相同的实例,即相同的浏览器。这就是依赖注入框架。
如果步骤在不同的步骤定义类中使用,则使用Spring注入允许您在步骤之间共享状态的对象。