评论

Minium+云测升级,自动创建页面类

升级原有的Minium+云测自动化方案,让编写自动化用例更高效

在之前【群接龙】利用录制回放辅助定位元素教程文章中,我们已经学会了如何使用利用录制回访功能来辅助编写Minium用例

我们在编写用例的过程中,发现将导出的元素复制到对应的页面类中,这个过程其实是费时且没有技术含量的,因此,我编写了一个新的脚本,用于实现将根据导出的录制文件,自动生成一个页面类模板,生成的页面类模板,我们应该遵守以下规则:

        1. 类名:

            - 从脚本中的commands["path"]字段中的最后一段提取.

            - 将此字段从kebab-case转换为CamelCase.

        2. 变量命名规则,需要其他规则的可以根据代码修改:

            -  当commands["command"]的值为"tap"时,变量名为"element_"。

            -  当commands["command"]的值为"input"时,变量名为"input_"。

            - 确保同一个xpath,只声明一个变量.

            - 确保每个tap或input类型的元素都被声明了

        3. 类方法,tap和send_key都是我封装的点击和输入方法,可以根据自己封装的方法名对代码进行更改:

            - 在每个类中包含一个'perform_actions'方法.

            - 使用 'self.tap' 来调用commands["command"]的值为"tap"的元素,如"self.tap(self.element)".

            - 使用 'self.send_key' 来调用commands["command"]的值为"input"的元素,如"self.send_key(self.input_,"value")"

           -  确保在perform_actions中调用每个element_和input_元素

        4. 变量的注释:

            - 在每个变量上面添加注释.

            - 注释的格式为 "#按钮名称: xx" ,其中xx的值来源是commands["text"]的值,如果commands["text"]的值为空,则使用command["tagName"]的值.

        5. 避免重复元素:

            - 如果再次遇到具有相同xpath的元素,则不要创建重复声明。

            - 当同一个xpath同时具有“tap”和“input”动作时,优先考虑“tap”动作,而忽略“input”。

6. 测试类模板:

- 创建一个名为“Test”的新类,并继承BasePage。

- 创建一个'__init__'方法

- 在'__init__'方法中,实例化所有页面类

因此,根据以上规则,生成下面的代码

import json
import os

object_path = os.path.join(os.path.abspath(os.path.dirname(os.path.dirname(__file__))))
file = os.path.join(object_path, "script/script.json").replace("\\", "/")

def generate_class_templates(files):
    def kebab_to_camel_case(kebab):
        return ''.join(word.capitalize() or '_' for word in kebab.split('-'))

    #元素命名
    element_naming = {
        "tap": "element_",
        "input": "input_"
    }

    class_templates = {}
    processed_elements = set()

    with open(files, encoding="UTF-8") as f:
        json_data = json.load(f)

    for command in json_data['commands']:
        if command['command'] in element_naming:
            action = command['command']
            variable_prefix = element_naming[action]
            xpath = command['target']
            comment = command.get('text', '').strip().replace('\n', ' ') or command['tagName'].strip().replace('\n', ' ')
            class_name = kebab_to_camel_case(command['path'].split('/')[-1])

            if xpath not in processed_elements or action == 'input':
                processed_elements.add(xpath)

                if class_name not in class_templates:
                    class_templates[class_name] = {'elements': [], 'actions': []}

                variable_name = variable_prefix
                element_declaration = f"    #按钮名称:{comment}\n    {variable_name} = '{xpath}'  \n"

                #元素类型为input,调用封装的send_key输入方法,否则调用封装tap方法点击元素
                if action == 'input':
                    method_call = f"        self.send_key(self.{variable_name}, 'input_value')\n"
                else:
                    method_call = f"        self.tap(self.{variable_name})\n"

                class_templates[class_name]['elements'].append(element_declaration)
                class_templates[class_name]['actions'].append(method_call)

    page_class_definitions = ""
    test_class_definitions = "class Test(BasePage):\n    def __init__(self, methodName='runTest'):\n        super().__init__(methodName)\n"

    for name, template in class_templates.items():
        page_class_definitions += f"class {name}(BasePage):\n"
        for declaration in template['elements']:
            page_class_definitions += declaration
        page_class_definitions += "\n    def perform_actions(self):\n"
        for call in template['actions']:
            page_class_definitions += call
        page_class_definitions += "\n\n"
        test_class_definitions += f"        self.{name.lower()} = {name}(self)\n"

    final_output = page_class_definitions + test_class_definitions

    return final_output

data = generate_class_templates(file)

output_file_path = os.path.join(object_path, "script/output_file.py").replace("\\", "/")

with open(output_file_path, 'w', encoding='UTF-8') as output_file:
    output_file.write("from base.basepage import BasePage\n\n")
    output_file.write(data)

print(f"Data has been successfully written to {output_file_path}")


我们先运行上个教程中的"read_script.py"脚本,创建页面文件,再执行上述脚本,即可在"script/output_file.py"路径下,生成一个页面模版,模版内容如下:

我们只需要根据元素的注释,维护好变量名,和根据页面操作维护好方法名,即可完成一个页面类的编写。

最后一次编辑于  02-01  
点赞 1
收藏
评论
登录 后发表内容