问题背景
项目上有个模型文件一直在变动,但是自动化脚本里面导入该模型是把模型名称写死了的,因此更新了模型文件之后,自动化测试代码里面为了导入该文件也一直要修改,所以想通过模糊匹配文件名称来获取该文件名称并导入。
解决方案
使用List Files In Directory关键字列出目录下面符合模糊匹配的文件名称,该关键字返回一个列表,获取列表中的第一个文件名称(项目中该文件名称前缀固定,后面携带的日期在变化)
${list}= List Files In Directory ${filepath}/mdaf/common/中文/应急中心/EMC_Package/ pattern=DC资源池级应急*
Log ${list}
${dc_model}= Set Variable ${list[0]}
Log ${dc_model}
${file_name} Remove String ${dc_model} .zip
Set Suite Variable ${dc_file_name} ${file_name}
踩的坑
最开始直接AI提供的方案是使用
{dc_model}= Evaluate str('{dc_model}')
{filename_without_ext}= Evaluate '{dc_model}'.replace('.zip', '')
结果却报错了UnicodeDecodeError: 'utf8' codec can't decode byte 0xe8 in position 0: unexpected end of data 类似的这种报错都是字符编码格式的。
出现这个问题的原因是使用了python的模块去处理字符串,默认转成了unicode字符串。
建议
建议优先使用robotframework自带的处理字符串的关键字
与字符串处理相关的关键字
-
基本字符串操作
Remove String${result}= Remove String Hello World World
结果: "Hello "
${result}= Remove String filename.zip .zip
结果: "filename"
Replace String
${result}= Replace String Hello World World Robot
# 结果: "Hello Robot"
Get Substring
${result}= Get Substring Hello World 0 5
# 结果: "Hello"
Split String
@{parts}= Split String one,two,three ,
# 结果: @{parts} = ['one', 'two', 'three']
Catenate
${result}= Catenate Hello World
# 结果: "Hello World"
${result}= Catenate SEPARATOR=- Hello World
# 结果: "Hello-World"
-
字符串检查
Should ContainShould Contain Hello World World
验证字符串包含指定内容
Should Not Contain
Should Not Contain Hello World Robot
# 验证字符串不包含指定内容
Should Start With
Should Start With Hello World Hello
# 验证字符串以指定内容开头
Should End With
Should End With Hello World World
# 验证字符串以指定内容结尾
-
字符串转换
Convert To Lowercase${result}= Convert To Lowercase Hello World
结果: "hello world"
Convert To Uppercase
${result}= Convert To Uppercase Hello World
# 结果: "HELLO WORLD"
Convert To String
${result}= Convert To String 123
# 结果: "123"
-
字符串清理
Strip String
{result}= Strip String {SPACE}Hello World${SPACE}结果: "Hello World" (去除前后空格)
Fetch From Left
${result}= Fetch From Left Hello World o
# 结果: "Hell"
Fetch From Right
${result}= Fetch From Right Hello World o
# 结果: "rld"
-
字符串比较
Should Be EqualShould Be Equal Hello Hello
验证两个字符串相等
Should Be Equal As Strings
Should Be Equal As Strings 123 123
# 将参数转为字符串后比较
Should Match
Should Match Hello World Hello*
# 使用通配符模式匹配
Should Match Regexp
Should Match Regexp example@email.com ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
# 使用正则表达式匹配
-
高级字符串处理
Get Length${length}= Get Length Hello World
结果: 11
Count Values In String
${count}= Count Values In String Hello World l
结果: 3 (统计'l'出现的次数)
Encode String To Bytes & Decode Bytes To String
${bytes}= Encode String To Bytes Hello World UTF-8
${string}= Decode Bytes To String ${bytes} UTF-8
# 处理编码转换