driver.back() 、driver.close() 、driver.quit()三者的区别

本文介绍了Selenium中几个浏览器操作方法。driver.back()可在点击跳转按钮后返回跳转前页面;driver.close()用于关闭当前显示窗口,打开多窗口时仅关闭当前窗口;driver.quit()能退出浏览器,无论打开多少窗口都会全部退出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、driver.back() 浏览器返回
使用场景:
在当前页面点击某个跳转按钮之后,使用driver.back()可以返回到跳转前的页面。

2、driver.close() 关闭浏览器
使用场景:
打开浏览器时,使用driver.close()可以关闭当前显示的窗口。如果打开多个窗口,也只会关闭当前的窗口,其他窗口正常显示。

3、driver.quit() 退出浏览器
使用场景:
打开浏览器时,使用driver.quit()可以退出浏览器。不管打开的是几个窗口,全部退出。

我需要实现对页面内所有可点击的元素点击,点击元素后跳转后的页面的内容也点击,现在我的代码陷入了死循环(部分日志如下: 返回初始页面 已点击元素 19/19 无弹窗 进入新页面 http://10.244.4.37/general/panel.html?pageid=11#,递归点击可点击元素 初始找到 19 个可点击元素 返回初始页面 返回初始页面 已点击元素 18/19 无弹窗 进入新页面 http://10.244.4.37/general/panel.html,递归点击可点击元素 初始找到 19 个可点击元素 已点击元素 19/19 无弹窗 进入新页面 http://10.244.4.37/general/panel.html#,递归点击可点击元素 初始找到 19 个可点击元素 返回初始页面 返回初始页面 已点击元素 19/19 无弹窗 进入新页面 http://10.244.4.37/general/panel.html#,递归点击可点击元素 初始找到 19 个可点击元素 返回初始页面 返回初始页面 已点击元素 15/19),有些元素点击后url改变但是有相同的部分,如(http://10.244.4.37/general/status.html,http://10.244.4.37/general/information.html?kind=item,http://10.244.4.37/general/panel.html),有相同的情况下页面变化的内容是右边的内容(右边的内容都在id=rightFrame)一个右边内容示例(<div id="rightFrame"><div id="mainContent"><div id="pageTitle"><h2>面板</h2></div><div id="pageContents"><form method="post" action="/general/panel.html"><div><input type="hidden" id="pageid" name="pageid" value="11"></div><div class="CSRFToken"><input type="hidden" id="CSRFToken1" name="CSRFToken" value="gtrRtIsVVTnOCg/sBypkCi99I3p8IywGYx2h+hYlZ0iqxHsg5n0m61JpaMJCp1lEQwzZ5aG2jxct U8LRzFZ1zRCuopnMC8dixlfr9kCzqZYui+1f6hts/Li65MczIbEoaKJZTPHYH/9WC5GQIFtLzwsM Ygpq6st6mqX9fzxVF9fC0I4vOi91SDloRU51UXFkbnljTXJhUHAzUHIzM1NYRHJPcnQ1bFJTT2JP SUpvSnc9AAAAAAAAAAAAAAAAAAAAAAAAAAAIuFXFCegCrwPtDMy5FEKHSxfAWDkJEwg0dBMH7kP2 DxD/BihDbfMc6qLDYK/D2EdeHevgbVq7xlWgzof3iAdaZ1Odqw/Si09Nu8P0tuNNJw=="></div><div><input type="hidden" id="postif_registration_reject" name="postif_registration_reject" value="1"></div><div class="contentsGroup"><dl class="items"><dt>液晶屏对比度</dt><dd><select id="B8" name="B8"><option value="0">-2</option><option value="1">-1</option><option value="2" selected="selected">0</option><option value="3">+1</option><option value="4">+2</option></select></dd><dt>自动在线</dt><dd><div><label class="radioSimple"><input type="radio" name="B9" value="1">关</label><label class="radioSimple"><input type="radio" name="B9" value="0" checked="checked">开</label></div></dd><dt>按钮重复</dt><dd><select id="Ba" name="Ba"><option value="0" selected="selected">0.1秒</option><option value="1">0.4秒</option><option value="2">0.6秒</option><option value="3">0.8秒</option><option value="4">1.0秒</option><option value="5">1.4秒</option><option value="6">1.8秒</option><option value="7">2.0秒</option></select></dd><dt>信息滚动</dt><dd><select id="Bb" name="Bb"><option value="0" selected="selected">级别1</option><option value="1">级别2</option><option value="2">级别3</option><option value="3">级别4</option><option value="4">级别5</option><option value="5">级别6</option><option value="6">级别7</option><option value="7">级别8</option><option value="8">级别9</option><option value="9">级别10</option></select></dd></dl></div><div class="contentsButtons"><input type="button" value="取消" onclick="location.href=location.pathname+'?pageid=11'"><input type="submit" value="提交"></div></form></div></div></div>) 这是我的代码 from django.contrib.auth.decorators import login_required from selenium import webdriver from selenium.webdriver import Keys from selenium.webdriver.chrome.options import Options as ChromeOptions from selenium.webdriver.edge.options import Options as EdgeOptions from selenium.webdriver.firefox.options import Options as FirefoxOptions from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.edge.service import Service as EdgeService from selenium.webdriver.firefox.service import Service as FirefoxService from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.action_chains import ActionChains from selenium.common.exceptions import TimeoutException, ElementClickInterceptedException, \ StaleElementReferenceException import time #浏览器配置 class BrowserConfig: def __init__(self, browser_type='edge', headless=False): self.browser_type = browser_type.lower() self.headless = headless self.options = self._setup_options() self.driver_path = self._get_driver_path() def _setup_options(self): options = { 'chrome': ChromeOptions(), 'edge': EdgeOptions(), 'firefox': FirefoxOptions() } if self.browser_type not in options: raise ValueError(f"Unsupported browser: {self.browser_type}") if self.headless: if self.browser_type == 'chrome': self.options.add_argument('--headless=new') self.options.add_argument('--disable-gpu') elif self.browser_type == 'edge': self.options.add_argument('--headless=chrome') elif self.browser_type == 'firefox': self.options.add_argument('--headless') return options[self.browser_type] def _get_driver_path(self): driver_paths = { 'edge': r"C:\own\app\python_code\work\入职培训\打印点击\msedgedriver.exe" } return driver_paths.get(self.browser_type) def get_driver(self): if self.browser_type == 'chrome': return webdriver.Chrome(options=self.options) elif self.browser_type == 'edge': if not self.driver_path: raise ValueError("Edge driver path is required.") service = EdgeService(executable_path=self.driver_path) return webdriver.Edge(service=service, options=self.options) elif self.browser_type == 'firefox': return webdriver.Firefox(options=self.options) else: raise ValueError(f"Unsupported browser: {self.browser_type}") #页面元素处理 class ElementActions: def __init__(self, driver): self.driver = driver self.action = ActionChains(driver) def scroll_to_element(self, element): try: self.driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", element) time.sleep(0.3) except Exception as e: print(f"滚动失败: {e}") def safe_click(self, element): try: element.click() except ElementClickInterceptedException: print("元素被遮挡,尝试使用 JavaScript 点击") self.driver.execute_script("arguments[0].click();", element) def wait_for_element(self, by, locator, timeout=10): return WebDriverWait(self.driver, timeout).until( EC.presence_of_element_located((by, locator))) def handle_alert(self): try: alert = WebDriverWait(self.driver, 3).until(EC.alert_is_present()) print("检测到弹窗,正在处理...") alert.accept() except TimeoutException: print("无弹窗") def handle_new_windows(self, original_window): current_windows = self.driver.window_handles if len(current_windows) > 1: for window in current_windows: if window != original_window: self.driver.switch_to.window(window) self.driver.close() self.driver.switch_to.window(original_window) def get_element_identifier(self, element): try: text = element.text.strip() tag = element.tag_name classes = ' '.join(element.get_attribute('class').split()) return f"{tag}_{classes}_{text}" except: return str(hash(element)) #页面操作实现 class AutomationWorkflow: def __init__(self, browser_config, login_url="http://10.244.1.179:3000/"): self.browser_config = browser_config self.login_url = login_url self.driver = browser_config.get_driver() self.element_actions = ElementActions(self.driver) self.driver.get(self.login_url) print(f"Browser {self.browser_config.browser_type} started in " f"{'headless' if self.browser_config.headless else 'headed'} mode.") def login(self, password): try: password_input = self.element_actions.wait_for_element(By.NAME, 'B1bc') password_input.send_keys(password) login_button = self.driver.find_element(By.ID, 'login') login_button.click() time.sleep(1) return True except TimeoutException: print("登录失败,元素未加载或超时") return False except Exception as e: print(f"登录过程中发生错误: {str(e)}") return False def logout(self): try: logout_button = self.driver.find_element( By.ID, 'logout') self.element_actions.safe_click(logout_button) print("登出成功") except Exception as e: print(f"登出过程中发生错误: {str(e)}") #跳过处理未知/不好的点击 def pass_handler(self, current_url): adm_url = "http://10.244.4.37/admin/password.html" net_url = "http://10.244.4.37/net/net/net.html" sup_url = "https://support.brother.com/g/b/producttop.aspx?c=cn&lang=zh&prod=hlb2050dn_cn&cgi=m00061%2fzh%2fsrc%3dDEVICE" find_url = "http://10.244.4.37/general/find.html" prt_url="http://10.244.4.37/print/print.html" pass_url = [adm_url, net_url, sup_url, find_url,prt_url] if current_url in pass_url: self.driver.back() return True # 表示跳过递归 return False # 表示可以递归点击 def click_all_clickable_elements(self, clicked_elements=None, start_index=0): if clicked_elements is None: clicked_elements = set() # 仅首次初始化 try: elements_locator = ( By.CSS_SELECTOR, 'button, a, input[type="button"], input[type="submit"], ' 'div[role="button"], div[onclick], [role="menuitem"], ' '[role="option"], [data-testid*="button"], [class*="btn"], ' '[class*="clickable"]' ) original_url = self.driver.current_url original_window = self.driver.current_window_handle skip_values = ["提交", "导出", "下载"] # 初始调用处理输入框 # self.handle_input_fields() # 获取初始页面所有可点击的元素 elements = WebDriverWait(self.driver, 10).until( EC.presence_of_all_elements_located(elements_locator) ) count = len(elements) print(f"初始找到 {count} 个可点击元素") for index in range(start_index, count): try: # 每次循环都重新获取元素列表,确保元素是最新的 elements = WebDriverWait(self.driver, 10).until( EC.presence_of_all_elements_located(elements_locator) ) if index >= len(elements): print(f"元素列表已变化,跳过索引 {index}") continue element = elements[index] # 获取元素ID进行去重 element_id = self.element_actions.get_element_identifier(element) if element_id in clicked_elements: print(f"元素 {index + 1} 已点击过,跳过") continue # 滑动到元素 self.element_actions.scroll_to_element(element) # 检查元素是否显示和启用 if element.is_displayed() and element.is_enabled(): # 获取元素的value属性 value = element.get_attribute("value") if value in skip_values: print(f"按钮 {value} 的值在跳过列表中,跳过点击") continue # 获取元素ID属性,避免特殊情况 element_id = element.get_attribute("id") if element_id == "logout": print("跳过登出按钮") continue # 点击元素 element.click() clicked_elements.add(element_id) print(f"已点击元素 {index + 1}/{count}") # 处理页面变化后的输入框 # if self.driver.current_url != original_url: # self.handle_input_fields() self.element_actions.handle_alert() self.element_actions.handle_new_windows(original_window) # 如果页面跳转了,递归点击新页面中的可点击元素 if self.driver.current_url != original_url: if self.pass_handler(self.driver.current_url): print("当前 URL 在跳过处理列表中,跳过递归点击") else: print(f"进入新页面 {self.driver.current_url},递归点击可点击元素") self.click_all_clickable_elements(clicked_elements, index + 1) # 递归调用,从下一个元素开始 self.driver.back() # 确保返回后元素列表重新加载 WebDriverWait(self.driver, 10).until( EC.presence_of_all_elements_located(elements_locator) ) print("返回初始页面") except StaleElementReferenceException as se: print(f"元素 {index + 1} 已失效,跳过") continue except Exception as e: print(f"点击元素 {index + 1} 时出错: {str(e)}") continue except Exception as e: print(f"处理可点击元素时出错: {str(e)}") def handle_input_fields(self): try: # 定位输入框元素 input_elements = WebDriverWait(self.driver, 10).until( EC.presence_of_all_elements_located( (By.CSS_SELECTOR, 'input[type="text"], input[type="email"], input[type="number"], ' 'input[type="password"], input[type="tel"], input[type="url"], ' 'textarea, [role="textbox"], [contenteditable="true"]') ) ) print(f"找到 {len(input_elements)} 个输入框") original_window = self.driver.current_window_handle original_url = self.driver.current_url for index, element in enumerate(input_elements): try: if not element.is_displayed() and not element.is_enabled(): print(f"输入框 {index + 1} 是隐藏\不可交互的,跳过处理") continue # 滑动到输入框 self.element_actions.scroll_to_element(element) print(f"请手动在输入框 {index + 1} 中输入内容。") time.sleep(5) # 等待手动输入 # 获取输入的内容 entered_value = self.driver.execute_script( "return arguments[0].value || arguments[0].textContent || arguments[0].innerText;", element ) print(f"您在输入框 {index + 1} 中输入的内容为: {entered_value}") # 提交表单 form = element.find_element(By.XPATH, "./ancestor::form[1]") if form: submit_buttons = form.find_elements(By.CSS_SELECTOR, 'button[type="submit"], input[type="submit"]') if submit_buttons: submit_buttons[0].click() print(f"已提交输入框 {index + 1} 所在的表单") time.sleep(1) # 处理新打开的窗口 current_windows = self.driver.window_handles if len(current_windows) > 1: for window in current_windows: if window != original_window: self.driver.switch_to.window(window) self.driver.close() self.driver.switch_to.window(original_window) else: if self.driver.current_url != original_url: self.driver.back() time.sleep(2) except Exception as e: print(f"处理输入框 {index + 1} 时出错: {str(e)}") except Exception as e: print(f"处理输入框时出错: {str(e)}") def run_automation(self, password,login_required=True): if login_required and self.login_url: if not self.login(password): print("登陆失败") return print("开始自动化操作...") self.click_all_clickable_elements() time.sleep(2) if login_required and self.login_url:#判断是否要登出 self.logout() print("自动化操作完成") time.sleep(3) self.driver.quit() if __name__ == "__main__": login_url = "http://10.244.4.37" password = "initpass" login_required=True browser_config = BrowserConfig(browser_type='edge', headless=False) automation_workflow = AutomationWorkflow( browser_config=browser_config, login_url=login_url) automation_workflow.run_automation(password,login_required) 修改我的代码,实现如果url有相同部分(10.244.4.37不算),获取可点击的从(rightFrame)获取,注意第一次检测和切换了url页面内容的获取
最新发布
08-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卢同学.

但行好事 莫问前程

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值