1import logging 2import re 3 4 5class Layout: 6 7 def __init__(self, json_data): 8 self.element_list = self.parse_attribute_nodes(json_data) 9 10 def parse_attribute_nodes(self, json_obj, attr_list=None): 11 if attr_list is None: 12 attr_list = [] 13 14 if isinstance(json_obj, dict): 15 for key, value in json_obj.items(): 16 if key == 'attributes' and isinstance(value, dict): 17 attr_list.append(value) 18 elif isinstance(value, (dict, list)): 19 self.parse_attribute_nodes(value, attr_list) 20 elif isinstance(json_obj, list): 21 for item in json_obj: 22 self.parse_attribute_nodes(item, attr_list) 23 return attr_list 24 25 def get_elements_by_text(self, text): 26 ems = [] 27 for e in self.element_list: 28 if e.get('text') == text: 29 ems.append(e) 30 return ems 31 32 def get_element_by_text(self, text, index=0): 33 ems = self.get_elements_by_text(text) 34 if not ems: 35 return 36 return ems[index] 37 38 def assert_text_exist(self, text): 39 element = self.get_elements_by_text(text) 40 rst = '是' if element else '否' 41 logging.info('检查[文本]="{}"是否存在?[{}]'.format(text, rst)) 42 assert element 43 44 def get_elements_by_type(self, _type): 45 ems = [] 46 for e in self.element_list: 47 if e.get('type') == _type: 48 ems.append(e) 49 return ems 50 51 def get_element_by_type(self, _type, index=0): 52 ems = self.get_elements_by_type(_type) 53 if not ems: 54 return 55 return ems[index] 56 57 def assert_type_exist(self, _type): 58 element = self.get_elements_by_type(_type) 59 rst = '是' if element else '否' 60 logging.info('检查[type]="{}"是否存在?[{}]'.format(_type, rst)) 61 assert element 62 63 def get_elements_by_key(self, key): 64 ems = [] 65 for e in self.element_list: 66 if e.get('key') == key: 67 ems.append(e) 68 return ems 69 70 def get_element_by_key(self, key, index=0): 71 ems = self.get_elements_by_key(key) 72 if not ems: 73 return 74 return ems[index] 75 76 def assert_key_exist(self, key): 77 element = self.get_elements_by_key(key) 78 rst = '是' if element else '否' 79 logging.info('检查[key]="{}"是否存在?[{}]'.format(key, rst)) 80 assert element 81 82 @staticmethod 83 def center_of_element(e): 84 assert e, '控件不存在' 85 bounds = e.get('bounds') 86 x1, y1, x2, y2 = [int(i) for i in re.findall(r'\d+', bounds)] 87 x = (x1 + x2) // 2 88 y = (y1 + y2) // 2 89 return x, y 90