【问题标题】:Implementing the Page Object Model实现页面对象模型
【发布时间】:2013-02-01 16:15:14
【问题描述】:

我正在使用 Perl 和 Selenium 构建一个测试自动化项目。我正在使用页面对象模型。我有点不确定 Selenium 驱动程序在页面对象模型的实现中的位置。

每个页面对象都应该“拥有”一个驱动程序吗?我的想法是每个页面对象代表页面提供给用户的一组服务。考虑到这个概念,页面对象与驱动程序没有“具有”关系。页面对象与驱动程序交互。但是,我仍在寻找建议。我应该将驱动程序作为 Web 应用程序中每个页面对象的一部分吗?

谢谢!

【问题讨论】:

    标签: automation selenium-webdriver


    【解决方案1】:

    这个答案与@zodvik 和您的思考过程没有太大不同,但它是另一种可选方法。您可以创建一个抽象类,而不是传递驱动程序,然后每个页面对象都可以从该类继承。从抽象类中,还可以包含一些您会发现自己经常使用的常用函数方法。

    这至少是我在 Java 语言中的做法。

    【讨论】:

      【解决方案2】:

      我总是将驱动程序作为每个页面对象的一部分。我对驱动程序的看法是它代表当前页面的状态。它提供对 URL、页面源等的访问权限。

      现在,每个页面都有一个当前 URL、页面源代码、页面标题,这些都可以通过驱动程序访问。

      【讨论】:

      • 感谢您的意见,nrbaf​​na。这就是我最终选择的方法!你说的对 !我意识到与页面交互的唯一方法是通过驱动程序,我正在传递驱动程序,所以它不像为每个页面创建一个新的驱动程序。
      【解决方案3】:

      顺便说一下,我实现了框架。我在包含常用元素的 commonFactory.class 中使用了驱动程序。每个页面都作为 commonFactory.class 的子类实现。所以你不必在每个类中实现驱动程序。由于驱动程序独立于测试场景,因此最好以单独的方式拥有它。

      【讨论】:

        【解决方案4】:

        据我了解,实施 POM 没有固定的规则/标准。

        但是,一般的经验法则是在您的框架中创建一个 BaseTest 和 BasePage 类,其中每个相应的网页(如登录)将由其 PageClass(LoginPage) 表示。 同样,您的所有 Page 类都将扩展您的 BasePage,所有测试都将扩展您的 BaseTest 类。

        下面是一个粗略的实现思路->

        
        public class BaseTest{
        
        @BeforeSuite()
        setupMethod(){
        initialize your WebDriver here
        }
        
        }
        
        ------------------------------------------
        public class BasePage {
        
          //create constructor
          public BasePage(WebDriver driver) {
            this.driver = driver;
            this.wait = new WebDriverWait(this.driver, Duration.ofSeconds(TIMEOUT));
            PageFactory.initElements(new AjaxElementLocatorFactory(this.driver, TIMEOUT), this);
          }
          
          //other common methods which can be utilized in your respective child Page classes
        
        }
        
        ----------------------------------------------------
        public class LoginPage extends BasePage {
        
            //Your Locators and Weblelements 
            private static final LOGIN_ID = "login";
            
            //Constructor to supply webdriver
            public LoginPage(WebDriver driver) {
                super(driver);
            }
            
            //your action methods
            public void loginToApp(){
            driver.findbyelement(By.ID(LOGIN_ID)).click
            }
        
        }
        ----------------------------------------------------
        public class LoginTest extends BaseTest{
        
        public LoginPage login;
        BeforeAll()
        {
        login = new LoginPage(driver);
        }
        
        @Test
        public void verifyLogin(){
        login.loginToApp();
        }
        
        }
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-12-03
          • 1970-01-01
          • 2014-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-18
          • 1970-01-01
          相关资源
          最近更新 更多