Best Python code snippet using ATX
android_layout.py
Source:android_layout.py  
...152153    def find_selector(self, node):154        '''find condition for locate a node, return (postion_node, condition, order)'''155        return self.__find_selector_by_structure(node)156        # return self.__find_selector_by_attrbutes(node)157        # return self.__find_selector_by_score(node)158159    def _filter_nodes(self, cond, nodes=None):160        if nodes is None:161            nodes = self.nodes162        res = []163        for n in nodes:164            match = True165            for k, v in cond.iteritems():166                attr = getattr(n, k)167                if isinstance(v, re._pattern_type) and \168                    isinstance(attr, basestring) and v.match(attr) is None:169                    match = False170                    break171                elif attr != v:172                    match = False173                    break174            if match:175                res.append(n)176        return res177178    def get_index_node(self, idx):179        '''get node with iterindex `idx`'''180        idx = self.node_index.index(idx)181        return self.nodes[idx]182183    def get_node_selector(self, n, sub=False):184        d = {}185        nodes = self.nodes186187        # try text, text in subnode cannot be all numbers188        if n.text and txt_pat.match(n.text) and not (sub and n.text.isdigit()):189            d['text'] = n.text190            nodes = self._filter_nodes(d, nodes)191            if len(nodes) == 1:192                return d, None193194        # try className, which is never blank195        d['className'] = n.className196        nodes = self._filter_nodes(d, nodes)197        if len(nodes) == 1:198            return d, None199200        # try description, like text201        if n.description and txt_pat.match(n.description) and not (sub and n.description.isdigit()):202            d['description'] = n.description203            nodes = self._filter_nodes(d, nodes)204            if len(nodes) == 1:205                return d, None206207        ## try resourceId, but on some phone the resourceId may not be available208        if n.resourceId:209            d['resourceId'] = n.resourceId210            nodes = self._filter_nodes(d, nodes)211            if len(nodes) == 1:212                return d, None213214        # return order in selected nodes under condition d.215        return d, nodes.index(n)216217    def __find_selector_by_structure(self, node):218        # try itself219        d, order = self.get_node_selector(node)220        if order is None:221            return node, d, None222223        # try its non-clickable decendants224        decendants = []225        def walk(n):226            for c in n.children:227                if c.clickable: continue228                decendants.append(c)229                walk(c)230        walk(node)231232        choices = []233        for n in decendants:234            sd, sorder = self.get_node_selector(n, True)235            choices.append((sorder or 0, -n.bounds.area, sorder, sd, n)) # add area to sort236        choices.sort()237238        if choices:239            return choices[0][-1], choices[0][-2], choices[0][-3]240241        # TODO242        # # try if its non-clickable parent243        # def is_decendant(n1, n2):244        #     '''check if n1 is decandant of n2'''245        #     for c in n2.children:246        #         if c == n1 or is_decendant(n1, c):247        #             return True248        #     return False249        #250        # p = node.parent251        # while p and not p.clickable:252        #     pd, porder = self.get_node_selector(p)253        #     if porder is None:254        #         print 'parent node', p.className255        #         for i in range(len(p.children)):256        #             c = p.children[i]257        #             if c == node or is_decendant(node, c):258        #                 print 'child', i, c==node, c.className, c.resourceId, c.text259        #         return pd, porder260        #     p = p.parent261262        return node, d, order263264    def __find_selector_by_attrbutes(self, node):265        # avoid repeat over same attr266267        def attrs(n, name):268            '''get node attribute values'''269            res = set()270            v = getattr(n, name)271            if v: res.add(v)272            for subn in n.children:273                if subn.clickable: continue274                res.update(attrs(subn, name))275            return res276277        def is_decendant(n1, n2):278            '''check if n1 is decandant of n2'''
...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
