页面对象模型讨论

时间:2016-12-20 12:49:03

标签: c# selenium-webdriver

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

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

公共类WelcomePage

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

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

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

案例1:

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

案例2:

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

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

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

JavaConversions

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

2 个答案:

答案 0 :(得分:2)

这是我在使用框架时遵循的概念:

  • 为页眉和页脚创建单独的文件(因为它们对于所有页面都是通用的,将它们作为单个页面的一部分没有意义)
  • 将常用元素(如搜索/后退/下一个等)保存在单独的文件中(想法是删除任何类型的重复并保持隔离逻辑)
  • 对于Driver,最好创建一个单独的Driver类并将Driver保持为静态,以便可以跨所有页面访问它! (我的所有网页都扩展了DriverClass)
  • PageObjects中使用的函数被分解为最小的块,记住它们的频率和调用方式(登录的方式 - 尽管登录可以分解为enterUsername和enterPassword函数但是仍然保持它作为登录功能更合乎逻辑,因为在大多数情况下,将调用Login函数而不是单独调用enterUsername和enterPassword函数)
  • 使用PageObjects本身将测试脚本与elementLocators
  • 分开
  • 将实用程序功能放在单独的utils文件夹中(如DateUtil,excelUtils等)
  • 在单独的conf文件夹中配置(例如设置需要运行测试的环境,配置输出和输入文件夹)
  • 将screenCapture合并失败
  • 在DriverClass中有一个静态等待变量,并且已经完成了一些隐含的等待时间
  • 总是尝试使用条件等待而不是静态等待:wait.until(ExpectedConditions)。这可以确保等待不会不必要地减慢执行速度。

希望有所帮助!

答案 1 :(得分:2)

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

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

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