测试人社区

求助:本问题是来自于appium数据驱动中,内容区的两种格式化方式为什么得到的结果不一样,没想通。

    def  steps(self,path):
        with  open(path,encoding="utf-8") as f:
            steps:list[dict]=yaml.safe_load(f)
            for step in steps:
                if "by" in step.keys():
                    element=self.find(step["by"],step["locator"])
                if "action" in step.keys():
                    if "click" == step["action"]:
                        element.click()
                    if "send" == step["action"]:
                        #{value}
                        content:str=step["value"]
                        for param in self.params:
                            #如果"{value1}"中的value与字典params中value的命中了,字典params中的value={value},
                            content= content.replace("{%s}%param",self.params[param])
                        element.send_keys(content)

content= content.replace("{%s}%param",self.params[param])
content= content.replace(f"{param}",self.params[param])
为什么这两个结果不一样呢? 麻烦老师解答下区别,

你是希望用这种方式来格式化字符串吧
"{%s}" % param
但是你写的格式不太对,写成了一整个字符串,所以结果与第二种正确使用的结果不一致

content= content.replace("{%s}%param",self.params[param]),这个得到的结果是预期结果
content= content.replace(f"{param}",self.params[param]),这个得到的结果不是预期结果

你看一下这个估计就明白了:
image
图片里面第一种才是正确的使用格式,可能第二中加了{}的歪打正着对了你的预期结果

首先确定你要替换的字符串是什么,至于使用哪种方式进行字符串的格式化并不重要,主要是格式化之后的字符串跟你想要被替换的字符串是一致的

你的语句中实际上有区别的只有replace方法的第一个参数,这个被替换的字符串的内容

  • 第一句是"{%s}%param" ,这个本身就是一个字符串,并没有任何字符串格式化的效果,只能代表这个字符串本身
  • 第二句是f"{param}",这个代表将你的param参数的值替换到字符串中,或者说相当于把param参数的值转换成字符串
  • 从本身这个方法来看,你是想写成一个通用方法的,这样的话必然就不能使用一个固定字符串,那么第二条看起来是对的。也可能是你在将代码复制到帖子中时字符串发生了变化导致展现出来的结果和你本地代码不一致,这个你也可以确认一下

你可以自己在python命令行里操作一下试一试,实际上用哪种方式进行格式化都可以获得你想要的数据,重要的在于怎么去组合获取到你要的结果