消息: 'this.get_element().style' 为空或不是对象

本文介绍了一个关于ASP.NET中UpdatePanel控件导致的问题,并提供了解决方案:通过删除特定的UpdatePanel控件(UpdatePanel3),利用ajax技术实现页面局部刷新,从而解决了遇到的技术难题。

删除 <asp:UpdatePanel ID="UpdatePanel3" runat="server" UpdateMode="Conditional">  ajax控件可以暂时解决这个问题。

我的点击逻辑:点击完页面所有非导航元素后点击一次导航栏再遍历点击所有非导航栏元素(也可以修改为先点一次导航栏中的一个按钮,再遍历点击所有非导航栏元素),修改代码 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_inside_navigation_bar(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) 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_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) # 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 self.click_navigation_bars(clicked_elements, depth=depth + 1)#点击完页面所有非导航元素后点击一次导航栏在遍历点击所有非导航栏元素 print("当前页面所有元素已点击完毕") 日志如下:开始自动化操作... 点击元素: a____印刷__ 点击失败: Message: stale element reference: stale element not found (Session info: MicrosoftEdge=139.0.3405.86); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#staleelementreferenceexception Stacktrace: GetHandleVerifier [0x0x7ff759e28c85+23461] (No symbol) [0x0x7ff759d7cd70] GetHandleVerifier [0x0x7ff75a0a0bb8+2611928] (No symbol) [0x0x7ff759b604d5] (No symbol) [0x0x7ff759b5f12f] (No symbol) [0x0x7ff759b608db] (No symbol) [0x0x7ff759b542ca] (No symbol) [0x0x7ff759b5271d] (No symbol) [0x0x7ff759b560ac] (No symbol) [0x0x7ff759b5617f] (No symbol) [0x0x7ff759b94c96] (No symbol) [0x0x7ff759bba6ba] (No symbol) [0x0x7ff759b8f58d] (No symbol) [0x0x7ff759b8f44d] (No symbol) [0x0x7ff759bba980] (No symbol) [0x0x7ff759b8f58d] (No symbol) [0x0x7ff759bd754f] (No symbol) [0x0x7ff759bba423] (No symbol) [0x0x7ff759b8ea86] (No symbol) [0x0x7ff759b8dd11] (No symbol) [0x0x7ff759b8e8b3] (No symbol) [0x0x7ff759c8e6fd] (No symbol) [0x0x7ff759c9ba88] GetHandleVerifier [0x0x7ff759f08acb+940523] GetHandleVerifier [0x0x7ff759f11821+976705] (No symbol) [0x0x7ff759d8a961] (No symbol) [0x0x7ff759d83344] (No symbol) [0x0x7ff759d83493] (No symbol) [0x0x7ff759d74f36] BaseThreadInitThunk [0x0x7ffc1799259d+29] RtlUserThreadStart [0x0x7ffc17e8af78+40] 点击失败: Message: stale element reference: stale element not found (Session info: MicrosoftEdge=139.0.3405.86); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#staleelementreferenceexception Stacktrace: GetHandleVerifier [0x0x7ff759e28c85+23461] (No symbol) [0x0x7ff759d7cd70] GetHandleVerifier [0x0x7ff75a0a0bb8+2611928] (No symbol) [0x0x7ff759b604d5] (No symbol) [0x0x7ff759b5f12f] (No symbol) [0x0x7ff759b608db] (No symbol) [0x0x7ff759b542ca] (No symbol) [0x0x7ff759b5271d] (No symbol) [0x0x7ff759b560ac] (No symbol) [0x0x7ff759b5617f] (No symbol) [0x0x7ff759b94c96] (No symbol) [0x0x7ff759bba6ba] (No symbol) [0x0x7ff759b8f58d] (No symbol) [0x0x7ff759b8f44d] (No symbol) [0x0x7ff759bba980] (No symbol) [0x0x7ff759b8f58d] (No symbol) [0x0x7ff759bd754f] (No symbol) [0x0x7ff759bba423] (No symbol) [0x0x7ff759b8ea86] (No symbol) [0x0x7ff759b8dd11] (No symbol) [0x0x7ff759b8e8b3] (No symbol) [0x0x7ff759c8e6fd] (No symbol) [0x0x7ff759c9ba88] GetHandleVerifier [0x0x7ff759f08acb+940523] GetHandleVerifier [0x0x7ff759f11821+976705] (No symbol) [0x0x7ff759d8a961] (No symbol) [0x0x7ff759d83344] (No symbol) [0x0x7ff759d83493] (No symbol) [0x0x7ff759d74f36] BaseThreadInitThunk [0x0x7ffc1799259d+29] RtlUserThreadStart [0x0x7ffc17e8af78+40]
最新发布
08-26
你遇到的错误是典型的 **`StaleElementReferenceException`**,这是 Selenium 中非常常见的问题,表示你之前获取的元素引用已经失效(例如页面刷新、DOM 重新加载、元素被移除等)。 --- ## ✅ 问题分析 你的点击逻辑大致如下: ```python elements = self.element_actions.get_all_clickable_elements() for element in elements: click element ``` 但问题在于:**`elements` 列表是在页面某个状态获取的,一旦点击某个元素导致页面刷新 DOM 改变,这些元素的引用就会失效(stale),后续循环再点击这些元素时就会抛出异常。** --- ## ✅ 解决方案 ### ✅ 1. 每次点击后重新获取元素(推荐做法) 每次点击后,重新调用 `get_all_clickable_elements()`,确保元素引用是最新的。 ```python 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 while True: elements = self.element_actions.get_all_clickable_elements() found_clickable = False 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) 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()) ) found_clickable = True break # 点击一个元素后,跳出循环重新获取元素列表 except StaleElementReferenceException: print("元素已失效,重新获取元素列表") break except Exception as e: print(f"点击失败: {e}") continue if not found_clickable: print("当前页面无可点击元素") break self.click_navigation_bars(clicked_elements, depth=depth + 1) print("当前页面所有元素已点击完毕") ``` ### ✅ 2. 使用 `try...except` 捕获 `StaleElementReferenceException` ```python from selenium.common.exceptions import StaleElementReferenceException # 在点击循环中加入 try...except for element in elements: try: ... except StaleElementReferenceException: print("元素已失效,重新获取元素列表") break ``` --- ## ✅ 3. 优化导航栏点击逻辑 你现在是: ```python self.click_navigation_bars(...) ``` 在点击完页面所有非导航元素后才点击导航栏。建议改为: ```python def click_all_clickable_elements(self, clicked_elements=None, depth=0, max_depth=20): if depth > max_depth: return if clicked_elements is None: clicked_elements = set() self.click_navigation_bars(clicked_elements, depth) self.click_non_navigation_elements(clicked_elements, depth) ``` 者: ```python def click_all_clickable_elements(self, clicked_elements=None, depth=0, max_depth=20): if depth > max_depth: return if clicked_elements is None: clicked_elements = set() # 先点击一次导航栏元素 nav_clicked = self.click_one_navigation_bar_element(clicked_elements) if nav_clicked: # 点击完导航栏后点击当前页面所有非导航栏元素 self.click_non_navigation_elements(clicked_elements, depth) # 再次点击所有非导航栏元素 self.click_non_navigation_elements(clicked_elements, depth) ``` 这样可以避免导航栏点击后页面结构变化导致非导航栏元素被遗漏。 --- ## ✅ 4. 高亮点击元素(保持) 你已经实现了 `highlight_element`,非常推荐保留,可以清晰看到点击了哪个元素。 --- ## ✅ 5. 防止死循环(可选) 加入最大点击次数限制: ```python MAX_CLICKS = 100 click_count = 0 ... click_count += 1 if click_count > MAX_CLICKS: print("已达到最大点击次数,停止") break ``` --- ## ✅ 6. 示例:`get_all_clickable_elements`(确保每次调用都是最新的) ```python def get_all_clickable_elements(self): script = """ const buttons = Array.from(document.querySelectorAll('button')); const links = Array.from(document.querySelectorAll('a')); const inputs = Array.from(document.querySelectorAll('input[type="button"], input[type="submit"]')); const others = Array.from(document.querySelectorAll('[role="button"], [onclick], [data-clickable]')); const all = [...buttons, ...links, ...inputs, ...others]; return all.filter(el => { const style = window.getComputedStyle(el); return style.display !== 'none' && style.visibility !== 'hidden'; }); """ return self.driver.execute_script(script) ``` --- ## ✅ 总结 | 问题 | 解决方案 | |------|----------| | `StaleElementReferenceException` | 每次点击后重新获取元素列表 | | 导航栏点击后元素丢失 | 先点击导航栏再点击非导航栏元素 | | 点击后页面刷新 | 使用 `WebDriverWait` 等待页面状态变化 | | 避免死循环 | 加入最大点击次数限制 | | 元素识别不稳定 | 使用 `get_element_identifier` XPath 唯一标识 | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值