关于lists:member 与 sets:is_element 性能比较

本文通过Erlang编程语言演示了使用列表和集合进行成员资格检查的性能对比测试。实验中创建了一个包含10万个元素的列表,并定义了两个函数分别使用列表和集合来检查指定元素是否存在。结果显示,集合操作比列表操作效率更高。

def is_navigation_bar(self, element, max_depth=5, current_depth=0): try: if current_depth > max_depth: return False # 1. 语义化标签判断 if element.tag_name.lower() == 'nav': return True # 2. ARIA role 判断 role = element.get_attribute('role') if role and role.lower() == 'navigation': return True # 3. class 名称匹配 class_name = element.get_attribute('class') if class_name: class_name = class_name.lower() if any(keyword in class_name for keyword in ['nav', 'navbar', 'navigation', 'menu', 'bar']): return True # 4. 增强结构识别 if self.contains_navigation_structure(element): return True # 5. 向上查找父元素 parent = element.find_element(By.XPATH, '..') if parent: return self.is_navigation_bar(parent, max_depth, current_depth + 1) return False except Exception as e: print(f"[导航栏识别] 出错: {e}") return False def contains_navigation_structure(self, element): """增强结构识别:查找是否有多个 <a>、<p> 或 <li>,支持嵌套结构""" # 查找所有 <a>、<p>、<li> 子元素 links = element.find_elements(By.XPATH, './/a | .//p | .//li') if len(links) >= 2: return True # 查找是否有多个 <ul> 或 <ol> lists = element.find_elements(By.XPATH, './/ul | .//ol') if len(lists) >= 1: return True # 递归查找子元素是否有导航结构 children = element.find_elements(By.XPATH, './*') for child in children: if self.contains_navigation_structure(child): return True return False def click_navigation_bars(self, clicked_elements, depth=0, max_depth=10): if depth > max_depth: print("达到最大递归深度,停止点击导航栏") return original_url = self.driver.current_url original_window = self.driver.current_window_handle elements = self.element_actions.get_all_clickable_elements() for element in elements: try: element_id = self.element_actions.get_element_identifier(element) if element_id in clicked_elements: continue if not self.is_navigation_bar(element): continue if not element.is_displayed() or not element.is_enabled(): continue # 新增判断:如果识别为导航栏元素,跳过非导航栏点击流程 if self.is_navigation_bar(element): print(f"[警告] 非导航栏流程中识别到导航栏元素: {element_id}") continue before_state = self.element_actions.get_page_state() self.element_actions.scroll_to_element(element) self.element_actions.highlight_element(element) self.element_actions.safe_click(element) clicked_elements.add(element_id) print(f"点击导航栏元素: {element_id}") self.pass_handler(element) #处理跳过指定url 测试时节约时间 self.element_actions.handle_alert() self.element_actions.handle_new_windows(original_window) WebDriverWait(self.driver, 10).until( lambda d: self.element_actions.compare_states(before_state, self.element_actions.get_page_state()) ) # 点击导航栏后检查是否有新非导航栏元素 self.click_all_clickable_elements(clicked_elements, depth=depth + 1) if self.driver.current_url != original_url: self.driver.back() WebDriverWait(self.driver, 10).until(EC.url_to_be(original_url)) except Exception as e: print(f"点击导航栏失败: {e}") continue print("导航栏元素已全部点击完毕") def click_navigation_elements(self, clicked_elements=None, depth=0, max_depth=10): if depth > max_depth: print("达到最大递归深度,停止点击导航栏") return if clicked_elements is None: clicked_elements = set() original_url = self.driver.current_url original_window = self.driver.current_window_handle # 获取页面中所有可能的导航栏 navigation_bars = self.find_all_navigation_bars() for nav_element in navigation_bars: try: # 获取导航栏内的所有可点击元素(如 <a>, <li>) clickable_elements = nav_element.find_elements(By.XPATH, './/a | .//li') for element in clickable_elements: element_id = self.element_actions.get_element_identifier(element) if element_id in clicked_elements: continue if not element.is_displayed() or not element.is_enabled(): continue before_state = self.element_actions.get_page_state() self.element_actions.scroll_to_element(element) self.element_actions.highlight_element(element) self.element_actions.safe_click(element) clicked_elements.add(element_id) print(f"点击导航栏元素: {element_id}") self.element_actions.handle_alert() self.element_actions.handle_new_windows(original_window) # 等待页面变化 WebDriverWait(self.driver, 10).until( lambda d: self.element_actions.compare_states(before_state, self.element_actions.get_page_state()) ) # 回退到原页面 if self.driver.current_url != original_url: self.driver.back() WebDriverWait(self.driver, 10).until(EC.url_to_be(original_url)) except Exception as e: print(f"点击导航栏元素失败: {e}") continue print("导航栏元素已全部点击完毕") def find_all_navigation_bars(self): """查找页面中所有可能是导航栏的元素""" all_elements = self.driver.find_elements(By.XPATH, '//*') navigation_bars = [] for elem in all_elements: if self.is_navigation_bar(elem): navigation_bars.append(elem) return navigation_bars def click_all_clickable_elements(self, clicked_elements=None, depth=0, max_depth=20): if depth > max_depth: print("达到最大递归深度,停止点击") return if clicked_elements is None: clicked_elements = set() original_url = self.driver.current_url original_window = self.driver.current_window_handle elements = self.element_actions.get_all_clickable_elements() for element in elements: try: element_id = self.element_actions.get_element_identifier(element) if element_id in clicked_elements: continue if self.element_actions.is_sensitive_element(element): continue if not element.is_displayed() or not element.is_enabled(): continue before_state = self.element_actions.get_page_state() self.element_actions.scroll_to_element(element) self.element_actions.highlight_element(element) self.element_actions.safe_click(element) clicked_elements.add(element_id) self.pass_handler(element) print(f"点击元素: {element_id}") self.pass_handler(element)#处理跳过指定url 测试时节约时间 # self.element_actions.handle_input_fields() self.element_actions.handle_alert() self.element_actions.handle_new_windows(original_window) WebDriverWait(self.driver, 10).until( lambda d: self.element_actions.compare_states(before_state, self.element_actions.get_page_state()) ) # 递归点击新页面 self.click_all_clickable_elements(clicked_elements, depth=depth + 1) if self.driver.current_url != original_url: self.driver.back() WebDriverWait(self.driver, 10).until(EC.url_to_be(original_url)) except Exception as e: print(f"点击失败: {e}") continue print("当前页面所有元素已点击完毕") 浏览器 chrome 启动成功 开始自动化操作... 点击元素: a____印刷__ 点击元素: a____基本設定__ 点击元素: a____管理者設定__ 点击元素: a____ネットワーク__ 印刷/基本设定这些是导航栏中的元素,被当成普通元素点击
最新发布
08-23
从你的代码来看,你正在使用 Selenium 实现一个自动点击页面导航栏元素的程序,用于测试 Web 页面。你提到“印刷/基本设定”这些导航栏元素被当成普通元素点击了,而不是被识别为导航栏的一部分,这可能是因为: 1. **`is_navigation_bar` 函数的识别逻辑可能没有覆盖到某些导航栏结构。** 2. **在 `click_all_clickable_elements` 函数中没有优先识别导航栏元素,而是直接点击了所有可点击的元素。** --- ### ✅ 改进思路 我们可以通过以下方式改进: 1. **优先识别导航栏区域**,然后 **仅点击导航栏内部的元素**,而不是将导航栏元素混入所有可点击元素中。 2. **优化导航栏识别逻辑**,使其更准确地识别嵌套结构、类名不明显的导航栏。 3. **将导航栏点击流程普通元素点击流程分离**,以避免重复点击或误识别。 --- ### ✅ 改进后的代码示例 ```python def click_navigation_elements(self, clicked_elements=None, depth=0, max_depth=10): if depth > max_depth: print("达到最大递归深度,停止点击导航栏") return if clicked_elements is None: clicked_elements = set() original_url = self.driver.current_url original_window = self.driver.current_window_handle # 查找所有导航栏 navigation_bars = self.find_all_navigation_bars() print(f"找到 {len(navigation_bars)} 个导航栏") for nav in navigation_bars: try: # 在导航栏内部查找所有 <a> 或 <li> 元素 items = nav.find_elements(By.XPATH, './/a | .//li') for item in items: if not item.is_displayed() or not item.is_enabled(): continue element_id = self.element_actions.get_element_identifier(item) if element_id in clicked_elements: continue print(f"正在点击导航栏项: {element_id}") before_state = self.element_actions.get_page_state() self.element_actions.scroll_to_element(item) self.element_actions.highlight_element(item) self.element_actions.safe_click(item) clicked_elements.add(element_id) # 处理弹窗、新窗口等 self.element_actions.handle_alert() self.element_actions.handle_new_windows(original_window) # 等待页面变化 WebDriverWait(self.driver, 10).until( lambda d: self.element_actions.compare_states(before_state, self.element_actions.get_page_state()) ) # 回退到原页面 if self.driver.current_url != original_url: self.driver.back() WebDriverWait(self.driver, 10).until(EC.url_to_be(original_url)) except Exception as e: print(f"点击导航栏失败: {e}") continue print("导航栏元素已全部点击完毕") ``` --- ### ✅ 解释改进点 1. **优先识别导航栏区域**: - 使用 `find_all_navigation_bars()` 找出所有导航栏区域。 - 在每个导航栏内查找可点击的 `<a>` 或 `<li>` 元素。 2. **点击逻辑更清晰**: - 不再将导航栏元素混入普通可点击元素中。 - 避免误将导航栏元素当作普通按钮处理。 3. **避免重复点击**: - 使用 `clicked_elements` 来记录已点击的元素 ID,防止重复操作。 4. **更准确的识别导航栏结构**: - 可以扩展 `is_navigation_bar()` 中的逻辑,例如使用 CSS 选择器、标签结构等。 --- ### ✅ 优化 `is_navigation_bar()` 的建议 你可以考虑添加以下判断: ```python # 6. 判断是否是 <ul> 或 <ol> 并且包含多个 <li> if element.tag_name.lower() in ['ul', 'ol']: items = element.find_elements(By.TAG_NAME, 'li') if len(items) >= 2: return True ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值