ios页面唯一标识解决方案
遇到的问题
众所周知,ios页面没有像android一样activity的概念,那么我们在做ios UI遍历或者ios Monkey的时候如何定义一个页面呢?下面提供两种解决方案
方案1 页面关键元素,生成页面标识
思路
通过wda获取的dom(python-wda的API:s.source()),然后筛选关键元素,我用的筛选方案是筛选dom中的button节点,然后删除影响比较大的因素,如长度过长,含有数字特殊字符的,再通过该信息生成页面md5
缺点:dom获取时间比较久,如果遇到比较复杂的页面,比如购物车,会耗时特别长
代码
筛选node
if node.type == "Button":
self.iosButtonList.append(node.label)
删除无效节点,生成md5
def init_page_info_ios_activity(device, page):
"""
创建ios页面的唯一标识activity
挑选dom中的button,删除影响比较大的因素,如长度过长,含有数字特殊字符的
:param device:
:param page:
:return:
"""
activity = ''
if device.client == "android":
return
for label in page.iosButtonList:
# 如果长度四个字符跳过
if len(label) > 3:
continue
# 如果存在数字那么跳过
if bool(re.search(r'\d', label)):
continue
activity += label
md5 = hashlib.md5(activity.encode()).hexdigest()
page.currentActivity = md5
方案2 图片通过cv能力,生成页面指纹
思路
页面截图,图片先cv处理灰度化、然后缩放为8*9的缩略图,最后再生成包含图像信息的指纹。阈值可以根据自己需要进行定制
利用事件操作前后的屏幕截图生成的像素指纹,进行对比判断是否为相同页面
缺点:遇到动态页面,如视频或者banner会影响判断
代码
生成指纹
def dHash(img):
# 差值哈希算法
# 缩放8*8
img = cv2.resize(img, (9, 8))
# 转换灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hash_str = ''
# 每行前一个像素大于后一个像素为1,相反为0,生成哈希
for i in range(8):
for j in range(8):
if gray[i, j] > gray[i, j + 1]:
hash_str = hash_str + '1'
else:
hash_str = hash_str + '0'
# print('==> dhash:', hash_str)
return hash_str
对比指纹
def compare_pic_by_dhash(path1, path2, threshold=18):
"""
通过差值hash判断图片相似度
:param path1:
:param path2:
:param threshold: 阈值
:return:
"""
img1 = cv2.imread(path1)
img2 = cv2.imread(path2)
hash1 = dHash(img1)
hash2 = dHash(img2)
n2 = cmpHash(hash1, hash2)
#print('差值哈希算法相似度dHash:', n2)
if n2 > threshold:
return False
if n2 == -1:
raise ValueError("compare para error")
return True