

OK~正常情况下我想很少会有小伙伴直接去操作影刀项目文件,当然特殊情况除外。就比如小白也曾遇到其他小伙伴的特殊需求,因为元素捕获的时候(大部分是软件端win元素),就会出现以下情况:

由于软件版本和系统版本有差异(这边还是推荐长期开发软件流程的使用win10、win11),导致捕获的元素不是那么适配,如果一个个去捕获去修改的话,费时又费力,就像这样:

那么,有没有办法快速批量的去处理这些元素呢?答案是有的,那就是修改影刀本地的项目文件--元素库文件(请注意!!真要到这个情况下,请先备份一份元素库文件,以防到时候真出问题不好复原!!)
那么首先就是咱们的工程文件到底在哪,每一个项目都有对应的元素库文件,首先挑选一个幸运鹅流程,选择修改应用信息。打开文件所在位置


之后如图所示,就能找到当前流程对应的元素库文件(一定要备份!!)

看到文件后缀,大家不难看出这个元素库文件是一个xml文件。
XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。它被设计用于传输和存储数据,而不关注数据的展示方式。XML文件由标签、属性和文本组成,具有自我描述性和可扩展性。
XML文件使用标签来定义数据的结构和层次关系。标签由尖括号包围,可以有开始标签和结束标签,也可以是自闭合标签。标签可以嵌套,形成层次结构。
XML文件还可以使用属性来提供关于标签的额外信息。属性是键值对的形式,用于描述标签的特性。
XML文件中的文本是标签中的内容,用于存储实际的数据。
文件打开(以网页形式)如下格式,稍微说下文件的几个重要点

文件包含了元素名称及匹配模式,根节点这边包含了3个命名空间及匹配方式。
影刀的元素库里,正常相等匹配的元素的属性结构为
属性名=属性值
采用正则匹配的元素属性结构为
regex:属性名=属性值
采用通配符匹配的元素属性结构为
wildcard:属性名=属性值
知道了这个情况之后,就方便咱们去手动修改调整了
知道了元素库文件的匹配方式之后,剩下的就是去修改了,小白这边有2大类的方法:
1.文本修改
比较直接的就是采用记事本、notepad++等软件直接打开,可以看到文件的结构,直接采用查找替换的方式也能实现,保存之后,打开项目,在元素库检查的时候可以发现元素被修改了。这个法子适用于小范围并且比较固定的匹配方式。


2.xpath定位修改
终于请出咱们的老朋友xpath了,其实XPath最初的目的是为了解决在XML文档中定位和选择节点的需求。XML文档是一种树状结构,节点之间存在层次关系。XPath提供了一种简洁而强大的语法,可以通过路径表达式来定位和选择XML文档中的节点。
这边小白就放上一部分代码供参考,选择文件位置、原属性、原属性值、原匹配方式、xpath定位语句、新匹配方式、新属性值后可批量修改
from lxml import etree
def modify_xml_file(file_name,att_name,att_value,new_att_value,path_str,mode_old,mode_new):
xml = etree.parse(file_name)
nsmap={'x':'rpa://selector/core','regex':'rpa://selector/operator/regex','wildcard':'rpa://selector/operator/wildcard'}
mode_url_old=nsmap[mode_old]
mode_url_new=nsmap[mode_new]
if mode_old !='x':
att_tem_name= mode_old + ':'+ att_name
else:
att_tem_name = att_name
#这边这部分填写xpath语句,小白这边比较固定的采用了匹配、开头、包含3中方式,剩下的大家自己发挥
# 比如path_str = '//*[starts-with(@{},"{}")]'就是采用了以xxx开头
nodes = xml.xpath(path_str.format(att_tem_name, att_value), namespaces=nsmap)
# 遍历所有查询到的节点
for node in nodes:
att_str='{' + mode_url_old +'}' + att_name
# 删除查询到的节点
if mode_old =='x':
del node.attrib[att_tem_name]
else:
del node.attrib[att_str]
# 设置新的属性(匹配方式)和属性值
if mode_new =='x':
node.set(att_name, new_att_value)
else:
att_new = '{{{x}}}{y}'.format(x=mode_url_new, y=att_name)
node.set(att_new, new_att_value)
xml.write(file_name)比如用这个办法,将咱们原来所有的相等匹配方式title='飞书',可以改成以正则匹配的方式匹配'飞书|钉钉'

打开咱们的软件流程,查看下元素,发现已经全部改成咱们需要的格式了


一定要备份好元素库!!大家还有什么好的想法和思路欢迎一起提出交流下