当前位置: 首页 > 知识库问答 >
问题:

页面对象模型讨论

丁子石
2023-03-14

我正在使用Selenium为我的网站构建一个测试框架,我实际上希望您在使用页面对象模型时对良好实践的想法:让我们说,我有一个欢迎页面,其中包含一个注销按钮存在的标题,这个标题可以在大多数页面中看到在我的页面中,我认为最好为标题写一个单独的类,比如:

public class Header
    {
        [FindsBy(How = How.Name, Using = "user_profile")]
        public IWebElement BtnUserProfile{ get; set; }

        [FindsBy(How = How.ClassName, Using = "logout_button")]
        public IWebElement BtnLogout { get; set; }

        public void Logout()
         {
            BtnLogout.Click();
         }
    }

 public class LoginPage
    {
        [FindsBy(How = How.Name, Using = "username")]
        public IWebElement TxtbxUserName { get; set; }

        [FindsBy(How = How.Name, Using = "password")]
        public IWebElement TxtbxPassword { get; set; }

        [FindsBy(How = How.ClassName, Using = "button")]
        public IWebElement BtnSignIn { get; set; }


        public string GoTO()
       {
           Driver.Navigate().GoToUrl(LoginURL);
       }
        public void Login(string username, string password)
         {
            TxtbxUserName.SendKeys(username);
            TxtbxPassword.SendKeys(password);
            BtnSignIn.Click();
         }
        public bool IsAt()
         {
             return Driver.Url == LoginURL;
         }
    }

公共类欢迎页

{
    [FindsBy(How = How.Name, Using = "welcome-message")]
    public IWebElement LblWelcomeMessage { get; set; }
}

我的问题是,你认为在欢迎页面中包含标题作为属性更好还是应该将它们分开?

让我们以注销测试方法的代码为例:

案例一:

public void LogoutTest() {
    LoginPage loginpage = new LoginPage();
    loginpage.GoTo();
    loginpage.login("user", "pass");
    Header header = new Header();
    header.Logout();
    Assert.IsTrue(loginpage.IsAt());
}

案例2:

public void LogoutTest() {
    LoginPage loginpage = new LoginPage();
    loginpage.GoTo();
    loginpage.login("user", "pass");
    WelcomePage wlcmPage = new WelcomePage();
    WelcomePage.Logout();
    Assert.IsTrue(loginpage.IsAt());
}

第二个问题是,您如何考虑为驱动程序编写一个静态类,而不是为每个页面编写一个单独的驱动程序。

第三个问题是你建议如何使用等待?我正在考虑将此方法添加到我的驱动程序静态类

public static void Wait(int seconds)
{
 Driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(seconds));
}

任何想法都将受到高度赞赏

共有2个答案

乐正远航
2023-03-14
  • 根据Sakshi Singla的建议,页眉和页脚可以在Page Class中分开。
  • 驱动程序类应该单独定义,并且获取驱动程序方法必须是静态的。原因是,如果你为驱动程序创建不同的实例,测试将失败,因为当流从1页类到2页类时,它将每次打开一个新实例。
  • 使返回WebDriver实例的Driver方法,使此方法静态。
  • 在页面类中,您可以选择在页面类的构造函数中调用此静态驱动程序方法,并将其分配给页面类的驱动程序变量。

下面的代码只是一个表示代码,您可能需要添加更多的行,例如页面工厂等。

public class driverConfig{

Static WebDriver driver;

public Static WebDriver getDriver{

driver = new WebDriver();
//Navigate to the URL here
return driver;
   }
}

public Class PageClass{

public WebDriver driver;

public PageClass(){
driver = driverConfig.getDriver();
   }
}
卞浩漫
2023-03-14

这是我在框架工作时遵循的概念:

  • 为页眉和页脚创建单独的文件(因为它们对于所有页面都是通用的,将它们作为单个页面的一部分是没有意义的)

希望有帮助!

 类似资料:
  • 是否有任何Gem(比如siteprism:用于Web自动化测试)可以在我的移动自动化测试项目中使用,以使用页面对象模型模式定义屏幕。 提前谢谢

  • 我正在使用Perl和Selenium构建一个测试自动化项目。我正在使用页面对象模型。我有点不确定Selenium驱动程序将适合页面对象模型的实现。 每个页面对象是否应该“有”一个驱动程序?我的想法是,每个页面对象代表页面向用户提供的一组服务。考虑到这个概念,页面对象与驱动程序没有“has-a”关系。页面对象与驱动程序交互。不过,我仍在寻求建议。我应该将驱动程序作为web应用程序中每个页面对象的一部

  • 想象有一个页面在说http://google.com/AddUser在这里输入记录的详细信息,然后单击保存。完成此操作后,页面将重定向到 http://google.com/userList 您可以在其中查看用户列表,包括您刚刚输入的新记录。 如果我们按照页面对象模型,那么在和验证记录是否实际保存和显示的方法应该在 如果我们认为addUser和userList是两个类的对应对象,它会像下面这样:

  • 我想在我的页面对象中使用剧作家的定位器。我找到了一个Javascript示例(为了简洁起见,将其剥离): 试图在我的Java代码中做同样的事情: 引发空指针异常,因为初始化登录按钮时,尚未启动。 我可以 但是对于大型页面对象类来说,这将变得有点冗长/混乱。 有没有关于如何在Java中实现这一点的想法? 谢谢

  • 在Java页面对象模型中创建步骤时实例化对象的最佳方法是什么? 有人知道Cucumber脚本是如何编译的吗? 我想,如果一切都建成并符合要求,下面的第二个或第三个选项可能是最好的方法。 如果只编译与正在执行的测试相关的步骤,那么我想这将是第一个。 我举了以下例子: 以上所有步骤(在同一个LoginSteps.java类中加上更多)从以下开始 这是最好的方法,还是创建单个实例更好? 或者在Login

  • 我们有一个复杂的多页面应用程序,单个页面上有多达100个网页元素,多个网格,动态元素等。POM模式要求页面的所有内容都封装在页面中,即在页面类中,我需要将我的定位器定义为字符串或Bys。我还应该定义与这些元素交互的公共方法。有两种处理这些交互的方法: 为每个元素和每个交互定义一个方法。例如,我有一个元素“Submit”。在我的page类中,我将创建ClickSubmit()公共方法,并在测试中调用