oop - 用于自动化测试的页面对象模型对 Web 应用程序有用吗

标签 oop selenium automated-tests watir qa

我的目标是使用浏览器自动化工具(例如 Selenium 或 Watir)构建一套测试。

如果我的理解正确,Page Object设计模式将网站上的单个页面表示为一个类,并包含在该页面上运行的测试方法。

对于一堆静态页面来说,这似乎没问题,但是如果该站点有更复杂的用户旅程,并且会经历多个阶段呢?例如:

  • 进入登录页面,以管理员身份登录
  • 进入用户管理页面,点击“新建用户”
  • 转到新用户页面并填写“创建新用户”表单
  • 断言用户已生成
  • 进入用户管理页面,选择新创建的用户
  • 单击“删除用户”并断言删除成功

  • 这个测试将如何构建——我希望保持浏览器的单个实例运行,所以我必须在每个页面对象之间传递浏览器对象才能在每个页面类中运行测试?

    最佳答案

    详细说明阿利斯特的回答(我同意)

    是的,它非常有用,它为您提供了一个位置(好吧,每页一个)来定义如何识别和执行与该页面上存在的对象的常见交互。因此,如果情况发生变化,您只需在一个地方更改脚本。您不会将测试放在页面对象中,而是定义页面元素和您可能在该页面上使用的常用方法。然后您的测试通过页面对象引用这些内容。

    当涉及到动态内容时,我主要会为步骤细节处理它,而不是尝试将其放入页面对象中。而是使用页面对象来标识诸如将从脚本中的多个步骤引用的动态内容的外部容器之类的内容。

    一个很好的例子可能是您的用户管理页面。让我们暂时假设一个页面,其中用户列在一个具有一致 ID 的表中,并且该表中是包含用户信息的行,其中一项是您要单击的链接用户名。虽然表 ID 是固定的,但表的内容无法预测,我们不知道任何时候可能有多少用户,也无法预测给定用户会列在哪一行。

    在那种情况下,我倾向于使用页面对象来创建对该页面元素的快速引用。然后,如果您正在编写诸如“鉴于我查看用户的详细信息:来自管理用户页面的用户名”之类的步骤,您最终可能会得到类似这样的代码(如果使用 watir 或 watir-webdriver)

    Given /^I view details for user: (.*) from the Manage Users page$/ do |user|
      manageUsersPage.userlist.link(:text, user).click
    end
    

    因此,用户名作为参数“用户”传递到步骤中,因此我可以使用任何用户代替用户名从脚本中的不同位置多次调用该步骤。

    我可能有许多其他步骤引用同一个表,并在那里执行操作或内容验证。并更改我识别 'userlist' 元素的方式,所有依赖于它的步骤都应该继续运行。

    现在让我们说稍后,表格的结构发生了变化,可能取消了用户名的链接,而是为详细信息、编辑、删除等功能添加了一些其他标准图标。所以现在旧的步骤坏了,为了修复它,我们可能会像这样改变它
    Given /^I view details for user: (.*) from the Manage Users page$/ do |user|
      manageUsersPage.userlist.cell(:text, username).parent.link(:class, 'view_user_details').click
    end
    

    请注意,因为我的步骤描述了我想要完成的任务,而不是详细说明如何完成,所以我不需要重新编写该步骤以使其继续在我的脚本中有意义。相反,我只是更改步骤背后的代码以反射(reflect)完成该任务的新方法。依赖此步骤作为其他测试的一部分的任何脚本都可以继续按原样使用该步骤。

    现在,如果您有脚本的单个部分详细描述了您如何查看用户详细信息,则需要将其废弃并更新以反射(reflect)新行为.. 好吧,没关系,我们希望因为事情的特定方面发生了变化,所以它应该必须更新。但这里的关键是仅在需要时谨慎使用非常详细的步骤,以便描述功能的详细操作。在其余的测试中,使用更高级别的步骤来描述您正在做什么,而不是您如何做。

    抱歉,可能在“如何做 bdd”方面挖掘得太深了,但我想表达的是,您不会仅通过页面对象来完成所有抽象。这是事情的一个非常重要的部分,但恕我直言,不是有效框架的完整解决方案。

    关于oop - 用于自动化测试的页面对象模型对 Web 应用程序有用吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7834893/

    相关文章:

    PHP:OOP 中的变量作用域?

    android - Calabash 使用 Paypal 进行自动化测试

    c# - 使用对比度传递函数调整相机模块焦点

    java - 无法使用 Selenium Webdriver 和 Java 在 Quora 中注册新帐户

    ios - UITableView 的属性可以是 UITableView Delegate 和 DataSource

    php - 确定调用函数的 namespace

    swift - 当您将对象作为参数传递时,何时发生实例化

    javascript - Protractor:如何迭代和比较使用转发器从应用程序和场景表中获得的值

    java - 如何设计我的 Java 类以使用已定义的 Utility 类的方法?

    java - 查找并获取网页发出的所有资源请求的响应码 - Java, Selenium