2017-05-31 7 views
0

私はCucumber SeleniumプロジェクトにSpringを統合しようとしています。Cucumber Spring PageObjectModel

プロジェクトは既に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統合前@After@Before注釈として分離したブラウザで実行するために使用される各機能は、私はドライバーが定義されているapplicationcontext.xmlファイルにSpringとの統合後キュウリ

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

    } 
} 

で利用可能であることに使用されています。 @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); 
    } 

しかし、春にコンストラクタを定義する必要があるが、これに関連するBeanの文句です。

ご協力いただければ幸いです。

答えて

2

なぜSpringを使用してブラウザを挿入していますか? Springは、同じインスタンス、つまり同じブラウザがどこでも使用されていることを確実にします。それは依存性注入のフレームワークでした。

ステップを異なるステップ定義クラスで使用する場合、ステップ間で状態を共有できるオブジェクトを挿入するには、Springを使用します。

関連する問題