针对yaml测试步骤解析中加入显示等待和步骤返回值处理的解决方案,麻烦老师指点下

针对公司项目,我在老师上课讲的基础之上,在yaml解析方法中加入了步骤显示等待和步骤返回值的处理,这样做是因为:1、我需要针对某些步骤做特定的显示等待,2、我需要其中某些步骤的返回值来做断言。代码如下:

测试步骤:

config_output:
# 1、点击“客户端”
  - by: xpath
    locator: "//[div[text()='客户端']]"
    action: click
# 2、点击第一个客户端的呼出设备
  - by: xpath
    locator: '//*'
    action: click
    wait: clickable
# 3、点击选择框
  - by: xpath
    locator: '//*'
    action: click
# 4、选择第2个呼出设备
  - by: xpath
    locator: '//*'
    action: click
# 5、获取设备名称
  - by: xpath
    locator: '//*'
    return_value:
# 6、点击保存
  - by: xpath
    locator: '//*'
    action: click
# 7、获取设备名称
  - by: xpath
    locator: '//*'
    return_value:

yaml解析方法

    def steps(self,path):
        with open(path) as f:
            name = inspect.stack()[1].function
            steps = yaml.safe_load(f)[name]
            rvs = [] # 存放步骤中返回的值,用于最后用例断言
        for step in steps:
            if "return_value" in steps.keys():
                # 执行步骤前,先判断是否该步骤有返回值,有返回值就提取其文本到rvs中
                rv = self.get_element(step['by'],step['locator']).text
                rvs.append(rv)
            if "action" in steps.keys():
                action = step["action"]
                if action == 'click':
                    if "wait" in step.keys():
                        self.wait_element_clickable(step['by',step['locator']]).click()
                    elif "sleep" == step["wait"]:
                        self.get_element(step['by'],step['locator']).click()
                    else:
                        self.get_element(step['by'],step['locator']).click()
                elif action == 'send':
                    self.get_element(step['by'],step['locator']).send_keys(step['value'])
        return rvs

麻烦老师指点下:

1、我这样处理步骤中需要的返回值和步骤需要的显示等待合适吗?有没有考虑不周全的地方(已测试能跑通)和更优的解决方案呢?
2、当需要从外部传入多个测试数据且每个测试数据会有不同的预期(如传入1,预期显示1,传入100,弹出错误提示),这种我知道可以通过pytest的parametrize进行数据驱动,但是不同的预期我该怎么写在yaml解析方法中进行处理呢?
3、这种设计思想与其说是测试步骤的数据驱动,是不是不如叫关键字驱动更合适呢?

  • 建议wait单独抽出来作为一个step 这样可以应对更多情况,不跟动作绑定在一起可以更灵活一些,当然这个也取决于实际使用情况。因为就像你之前说的,有可能你要等待的元素和你之后操作的元素不是同一个元素。
  • 抽取返回值的话我建议带个变量名,然后用一个字典去存储名字和对应的值,这样即使之后返回值顺序变更或者是数量变化了也不会影响到其它步骤的运行。

我现在用的是列表去存储返回值,最后通过索引来取,如何?
另外还有第2、3个问题 :grin: