在之前【群接龙】利用录制回放辅助定位元素教程文章中,我们已经学会了如何使用利用录制回访功能来辅助编写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"路径下,生成一个页面模版,模版内容如下:
我们只需要根据元素的注释,维护好变量名,和根据页面操作维护好方法名,即可完成一个页面类的编写。