如何在使用selenium/java钩子之前动态地获取正确的页面类?

zaq34kh6  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(457)

我有一个selenium/cucumber基础设施,用于测试至少3页(编辑、概述、发送)的网站。所有my page类都是从abstractpage扩展而来的,abstractpage只有一个linkedhashmap,其中包含所有WebElement和驱动程序。我还有一个页面管理器来设置CurrentPage和getpage。在每个场景之前,我必须启动网站并将页面设置为editpage。我想写一个方法,从我的beforehook步骤中动态获取editpage,因为每个站点都有另一个名称,并且位于另一个包中。
例如:我启动了“website1”的测试,在启动webdriver并准备好url后,我现在需要将“Website1Edit.java”作为abstractpage来设置当前页面。
abstractpage.java:

  1. public abstract class AbstractPage {
  2. public Map<String, AbstractWebElement> webElementMap = new LinkedHashMap<>();
  3. public Map<String, AbstractWebElement> getListOfWebElementType(WebElementType type) {
  4. Map<String, AbstractWebElement> WebElementMapOfType = new HashMap<>();
  5. webElementMap.forEach((description, value) -> {
  6. if(value.getWebElementType() == type)
  7. WebElementMapOfType.put(description,value);
  8. });
  9. return WebElementMapOfType;
  10. }
  11. public AbstractPage getPage(){
  12. return this;
  13. }
  14. }

pagemanager.java

  1. @Component
  2. @Scope(SCOPE_CUCUMBER_GLUE)
  3. @RequiredArgsConstructor
  4. public class PageManager {
  5. private AbstractPage currentPage;
  6. private String destination;
  7. public AbstractPage getPage() {
  8. return currentPage;
  9. }
  10. public void setCurrentPage(AbstractPage page) {
  11. currentPage = page;
  12. }
  13. }

website1editpage.java

  1. @Component
  2. @Scope(SCOPE_CUCUMBER_GLUE)
  3. public class WebSite1EditPage extends AbstractPage {
  4. public WebSite1EditPage(WebDriver driver) {
  5. ...All WebElement Objects from webElementMap (webElementMap.put(...))
  6. }

website1editpagesteps.java

  1. @Slf4j
  2. @RequiredArgsConstructor
  3. public class WebSite1EditPageSteps {
  4. private final PageManager pageManager;
  5. private final WebSite1EditPage webSite1EditPage;
  6. @Given("Launch the WebSite1")
  7. public void launchTheWebSite1() {
  8. pageManager.setCurrentPage(webSite1EditPage); //This is the step i want to write in Before-Hook, because i have to do this for every another website, i allways need the EditPage to Start my tests
  9. }

hooks.java

  1. @Before
  2. public void beforeScenario(Scenario scenario){
  3. String feature = getFeatureName(scenario.getId());
  4. endPointManager.setFormToken(feature);
  5. log.info("This Step open the Browser and launch the " + feature + " Website."); //Feature is the WebSite Name in my case
  6. String url = connectionProperties.getWebSite().getUrlAsString() +
  7. endPointManager.getEndPoint();
  8. webDriver.get(url);
  9. assertThat(webDriver.getCurrentUrl()).isEqualTo(url);
  10. String pageName = getFeatureName(scenario.getId()) + "EditPage"; // getFeatureName(scenario.getId() gives me my WebSite Name in this case here "WebSite1"
  11. pageManager.getPage(pageName); //Something like this is my idea. But its not working because, String cannot be Converted to AbstractPage.
  12. }
9lowa7mx

9lowa7mx1#

带有@before-hook的方法可能会在带有@given注解的方法之前运行,因此我认为应该在@before-hook中调用setpage方法,然后在名为launchwebsite1()的方法中调用页面
类似的方法可能会奏效:

  1. @Before
  2. public void beforeScenario(Scenario scenario){
  3. String feature = getFeatureName(scenario.getId());
  4. endPointManager.setFormToken(feature);
  5. log.info("This Step open the Browser and launch the " + feature + " Website."); //Feature is the WebSite Name in my case
  6. String url = connectionProperties.getWebSite().getUrlAsString() +
  7. endPointManager.getEndPoint();
  8. webDriver.get(url);
  9. assertThat(webDriver.getCurrentUrl()).isEqualTo(url);
  10. String pageName = getFeatureName(scenario.getId()) + "EditPage"; //This may be unnecessary
  11. WebSite1EditPage webSite1EditPage = new WebSite1EditPage(webDriver);
  12. pageManager.setCurrentPage(webSite1EditPage);

在@given方法中,您可以调用如下页面:

  1. @Given("Launch the WebSite1")
  2. public void launchTheWebSite1() {
  3. WebSite1EditPage webSite1EditPage = pageManager.getCurrentPage();
  4. }

我不确定这是否有效,但我希望它能有所帮助。
顺致敬意,

展开查看全部

相关问题