页面对象中的函数是否适合大型项目?

时间:2018-11-06 14:36:19

标签: selenium protractor ui-automation qa browser-automation

我正在为一个大型Web应用程序编写自动化测试。 我有一个页面对象文件,其中包含与正在测试的组件有关的所有元素的选择器以及测试文件(一个文件包含一个组件的多个测试用例)。

主要问题是:将多个测试使用的函数放在哪里? 以下哪种做法是正确的? (po =页面目标文件)

  1. 没有期望/断言命令的功能应位于po中,而其他命令应位于帮助文件中(每个组件/功能1个帮助文件)

  2. 帮助文件中的所有功能

  3. 在po中没有期望/断言命令的功能,其他命令应只写在测试本身中(此时某些测试文件可能有700多个行)

如果有人能告诉我哪种方法是正确的方法,我将不胜感激

p.s。使用javascript / typescript,硒webdriver,量角器,茉莉进行网络自动化

2 个答案:

答案 0 :(得分:1)

一切都对您有好处。没有一个正确的答案。因此,我将分享我在当前项目中适合自己的经验。这是我的测试脚本的简短示例

"use strict";
/*********************************************
 *  Imports
 *********************************************/
const users = require("page-objects/users");
const {logIn, logOut} = require("actions/actions");
const editUser = require("page-objects/dialogs/edit-user");

/*********************************************
 *  E2E Test
 *********************************************/
describe("Suite: Right for export", () => {

    beforeAll(async () => await logIn("user-list"));
    afterAll(async () => await logOut());

    it("Case - Export enabled", async () => {

        await users.searchFor("testuser12");
        await users.clickEditLink("testuser12");
        await editUser.enableExport(true);
        await editUser.update();

        expect(await users.getCellValue("Is Export Enabled")).toBe("YES");
    });
});

1)页面对象中有什么?

如您所见,我宁愿坚持在测试中坚持到底。因此,searchFor单击搜索字段,将其清空,键入传递的字符串,按Enter,然后调用等待功能,直到应用搜索为止。但是,如果没有技术人员想要手动进行操作,他们可能会猜测他们需要执行以上所有操作才能找到所需的内容。这就是为什么对他们来说无关紧要的所有东西都在Page-Objects的幕后。

2)页面对象是否应包含功能?

为什么不呢? :)可以说我有一个更改用户权限的弹出窗口。除了页面对象(与测试分离的文件)中列出的所有定位符之外,我还可以包括针对它执行的操作。假设selectOption()将单击下拉菜单->选择选项->确认。或者,您想单击更新按钮,然后等待对话框消失。这些都是我的采购订单中方法的示例。看一下语法:如果非技术人员看到editUser.enableExport(true);,他们可能会根据其所在对象的名字(针对执行该操作的页面)来找出答案-在此处editUser弹出窗口中,则该方法为self说明性显示了它的作用-启用导出权限(或如果传递false则禁用导出),然后在()内列出参数-true或false。但是,请避免在您的PO中使用期望语句,因为这是测试的目的。

3)如何构建文件?

可能需要分隔超过700行的所有内容。但这不是规则,而是我的经验。每个组件(有时每页)创建一个文件。但是,例如,如果页面具有弹出窗口,则它可能是单独的页面对象。要组织代码,请使用js类,构造函数(查找它们)。然后,如果您的配置指向这些文件,则可以分配一个全局变量。或者像我一样,在每次测试之前都需要必要的组件-更长的时间,但是将所有内容都放在一个地方。

祝你好运!

答案 1 :(得分:0)

  1. 通过业务逻辑,页面区域或功能区域将每个页面分成小组件。

  2. 定义选择器,用于操作元素的功能,用于验证单个文件中每个组件的功能。

  3. 为页面定义文件以引用组件。

  4. 对于多个页面使用的公共组件,您可以移动到公共文件夹。

文件夹结构:

Project Folder
  |
  -- PageA foler
     CompA.ts
     CompB.ts
     ...
     index.ts

// Index.ts

class PageA {

   public compA;
   public compB;

   contructor() {
      this.compA = new CompA()
      this.compB = new CompB()
   }
}

export = new PageA();

//茉莉花test-compA.ts

pageA.compA.inputUserName();
pageA.compB.clickLogin();
pageA.compB.verify...();

//茉莉花test-pageA.ts