Mac OS X 开发模式: Enable Developer Mode on this Mac?

本文介绍了如何通过在终端输入特定命令来快速启用Xcode的开发模式,从而避免每次debug时都需要输入用户名和密码的繁琐过程。

首次运行xcode的时候会提示要不要激活Mac OS X操作系统的开发模式( Enable Developer Mode on this Mac?)。

如图:

                

然后: 点击【Enable】按钮后,输入密码即可。

 

如里点击了【Don`t Enable】以后每次debug时都会让你输入用户名、密码,让人不胜其烦。

其实,可以在terminal里面输入:

DevToolsSecurity -enable
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.edge.service import Service from selenium.webdriver.edge.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.action_chains import ActionChains import time # 配置Edge浏览器选项 def configure_edge_options(): """配置Edge浏览器选项""" options = Options() options.add_argument("--start-maximized") # 最大化窗口 options.add_argument("--disable-notifications") # 禁用通知 # options.add_argument("--headless") # 无头模式(可选) options.add_experimental_option("excludeSwitches", ["enable-automation"]) # 隐藏自动化控制提示 options.add_experimental_option("useAutomationExtension", False) # 禁用自动化扩展 return options # 初始化Edge浏览器驱动 def init_edge_driver(): """初始化Edge浏览器驱动""" try: # 尝试使用webdriver-manager自动管理驱动 from webdriver_manager.microsoft import EdgeChromiumDriverManager service = Service(EdgeChromiumDriverManager().install()) return webdriver.Edge(service=service, options=configure_edge_options()) except: # 如果自动管理失败,尝试手动指定路径 try: # Windows默认路径 service = Service(executable_path="C:/Program Files (x86)/Microsoft/Edge/Application/msedgedriver.exe") return webdriver.Edge(service=service, options=configure_edge_options()) except: # Linux/Mac路径 service = Service(executable_path="/usr/local/bin/msedgedriver") return webdriver.Edge(service=service, options=configure_edge_options()) # 初始化浏览器 driver = init_edge_driver() try: # 1. 打开网页 print("打开百度首页...") driver.get("https://www.baidu.com") # 2. 获取页面标题和URL print(f"页面标题: {driver.title}") print(f"当前URL: {driver.current_url}") # 3. 定位元素并输入搜索词 search_box = driver.find_element(By.ID, "kw") search_box.send_keys("Selenium Edge浏览器自动化") # 4. 提交搜索表单 search_box.submit() # 5. 显式等待结果加载 print("等待搜索结果加载...") WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "content_left")) ) # 6. 获取搜索结果数量 result_stats = driver.find_element(By.CLASS_NAME, "nums_text").text print(f"搜索结果: {result_stats}") # 7. 点击第一个搜索结果 first_result = driver.find_element(By.CSS_SELECTOR, "#content_left .result-op h3 a") first_result.click() # 8. 切换到新标签页 print("切换到新标签页...") driver.switch_to.window(driver.window_handles[-1]) # 9. 页面滚动 print("滚动页面...") driver.execute_script("window.scrollTo(0, document.body.scrollHeight/2);") time.sleep(1) driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(1) driver.execute_script("window.scrollTo(0, 0);") # 10. 鼠标悬停操作 print("执行鼠标悬停操作...") try: # 尝试在页面上找到可悬停的元素 hover_element = driver.find_element(By.CSS_SELECTOR, "nav a") ActionChains(driver).move_to_element(hover_element).perform() time.sleep(1) except: print("未找到可悬停元素,跳过此步骤") # 11. 浏览器导航操作 print("浏览器导航操作...") driver.back() # 返回上一页 time.sleep(1) driver.forward() # 前进 time.sleep(1) driver.refresh() # 刷新页面 time.sleep(1) # 12. 处理弹窗 print("处理JavaScript弹窗...") # 触发一个alert弹窗 driver.execute_script("alert('这是Selenium测试弹窗!');") # 切换到弹窗并接受 alert = driver.switch_to.alert print(f"弹窗内容: {alert.text}") alert.accept() # 13. 操作浏览器窗口 print("操作浏览器窗口...") # 获取当前窗口大小 print(f"当前窗口尺寸: {driver.get_window_size()}") # 设置窗口大小 driver.set_window_size(800, 600) time.sleep(1) # 最大化窗口 driver.maximize_window() time.sleep(1) # 14. 获取页面截图 print("保存页面截图...") driver.save_screenshot("selenium_screenshot.png") # 15. 获取页面源码 # print("获取页面源码...") # page_source = driver.page_source # with open("page_source.html", "w", encoding="utf-8") as f: # f.write(page_source) print("所有基础操作执行完成!") finally: # 16. 关闭浏览器 input("按Enter键关闭浏览器...") # 用于演示时查看结果 driver.quit() print("浏览器已关闭") 运行结果: ValueError Traceback (most recent call last) Cell In[9], line 28, in init_edge_driver() 27 from webdriver_manager.microsoft import EdgeChromiumDriverManager ---> 28 service = Service(EdgeChromiumDriverManager().install()) 29 return webdriver.Edge(service=service, options=configure_edge_options()) File ~\AppData\Roaming\Python\Python313\site-packages\webdriver_manager\microsoft.py:73, in EdgeChromiumDriverManager.install(self) 72 def install(self) -> str: ---> 73 driver_path = self._get_driver_binary_path(self.driver) 74 os.chmod(driver_path, 0o755) File ~\AppData\Roaming\Python\Python313\site-packages\webdriver_manager\core\manager.py:35, in DriverManager._get_driver_binary_path(self, driver) 34 def _get_driver_binary_path(self, driver): ---> 35 binary_path = self._cache_manager.find_driver(driver) 36 if binary_path: File ~\AppData\Roaming\Python\Python313\site-packages\webdriver_manager\core\driver_cache.py:107, in DriverCacheManager.find_driver(self, driver) 105 return None --> 107 driver_version = self.get_cache_key_driver_version(driver) 108 metadata = self.load_metadata_content() File ~\AppData\Roaming\Python\Python313\site-packages\webdriver_manager\core\driver_cache.py:154, in DriverCacheManager.get_cache_key_driver_version(self, driver) 153 return self._cache_key_driver_version --> 154 return driver.get_driver_version_to_download() File ~\AppData\Roaming\Python\Python313\site-packages\webdriver_manager\core\driver.py:48, in Driver.get_driver_version_to_download(self) 46 return self._driver_version_to_download ---> 48 return self.get_latest_release_version() File ~\AppData\Roaming\Python\Python313\site-packages\webdriver_manager\drivers\edge.py:51, in EdgeChromiumDriver.get_latest_release_version(self) 43 latest_release_url = { 44 OSType.WIN 45 in os_type: f"{self._latest_release_url}_{major_edge_version}_WINDOWS", (...) 49 in os_type: f"{self._latest_release_url}_{major_edge_version}_LINUX", 50 }[True] ---> 51 resp = self._http_client.get(url=latest_release_url) 52 return resp.text.rstrip() File ~\AppData\Roaming\Python\Python313\site-packages\webdriver_manager\core\http.py:36, in WDMHttpClient.get(self, url, **kwargs) 35 raise exceptions.ConnectionError(f"Could not reach host. Are you offline?") ---> 36 self.validate_response(resp) 37 return resp File ~\AppData\Roaming\Python\Python313\site-packages\webdriver_manager\core\http.py:15, in HttpClient.validate_response(resp) 14 if status_code == 404: ---> 15 raise ValueError(f"There is no such driver by url {resp.url}") 16 elif status_code == 401: ValueError: There is no such driver by url https://msedgedriver.azureedge.net/LATEST_RELEASE_138_WINDOWS During handling of the above exception, another exception occurred: ValueError Traceback (most recent call last) File ~\AppData\Roaming\Python\Python313\site-packages\selenium\webdriver\common\driver_finder.py:64, in DriverFinder._binary_paths(self) 63 if not Path(path).is_file(): ---> 64 raise ValueError(f"The path is not a valid file: {path}") 65 self._paths["driver_path"] = path ValueError: The path is not a valid file: C:/Program Files (x86)/Microsoft/Edge/Application/msedgedriver.exe The above exception was the direct cause of the following exception: NoSuchDriverException Traceback (most recent call last) Cell In[9], line 35, in init_edge_driver() 34 service = Service(executable_path="C:/Program Files (x86)/Microsoft/Edge/Application/msedgedriver.exe") ---> 35 return webdriver.Edge(service=service, options=configure_edge_options()) 36 except: 37 # Linux/Mac路径 File ~\AppData\Roaming\Python\Python313\site-packages\selenium\webdriver\edge\webdriver.py:47, in WebDriver.__init__(self, options, service, keep_alive) 45 options = options if options else Options() ---> 47 super().__init__( 48 browser_name=DesiredCapabilities.EDGE["browserName"], 49 vendor_prefix="ms", 50 options=options, 51 service=service, 52 keep_alive=keep_alive, 53 ) File ~\AppData\Roaming\Python\Python313\site-packages\selenium\webdriver\chromium\webdriver.py:53, in ChromiumDriver.__init__(self, browser_name, vendor_prefix, options, service, keep_alive) 52 finder = DriverFinder(self.service, options) ---> 53 if finder.get_browser_path(): 54 options.binary_location = finder.get_browser_path() File ~\AppData\Roaming\Python\Python313\site-packages\selenium\webdriver\common\driver_finder.py:47, in DriverFinder.get_browser_path(self) 46 def get_browser_path(self) -> str: ---> 47 return self._binary_paths()["browser_path"] File ~\AppData\Roaming\Python\Python313\site-packages\selenium\webdriver\common\driver_finder.py:78, in DriverFinder._binary_paths(self) 77 msg = f"Unable to obtain driver for {browser}" ---> 78 raise NoSuchDriverException(msg) from err 79 return self._paths NoSuchDriverException: Message: Unable to obtain driver for MicrosoftEdge; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/driver_location During handling of the above exception, another exception occurred: ValueError Traceback (most recent call last) File ~\AppData\Roaming\Python\Python313\site-packages\selenium\webdriver\common\driver_finder.py:64, in DriverFinder._binary_paths(self) 63 if not Path(path).is_file(): ---> 64 raise ValueError(f"The path is not a valid file: {path}") 65 self._paths["driver_path"] = path ValueError: The path is not a valid file: /usr/local/bin/msedgedriver The above exception was the direct cause of the following exception: NoSuchDriverException Traceback (most recent call last) Cell In[9], line 42 39 return webdriver.Edge(service=service, options=configure_edge_options()) 41 # 初始化浏览器 ---> 42 driver = init_edge_driver() 44 try: 45 # 1. 打开网页 46 print("打开百度首页...") Cell In[9], line 39, in init_edge_driver() 36 except: 37 # Linux/Mac路径 38 service = Service(executable_path="/usr/local/bin/msedgedriver") ---> 39 return webdriver.Edge(service=service, options=configure_edge_options()) File ~\AppData\Roaming\Python\Python313\site-packages\selenium\webdriver\edge\webdriver.py:47, in WebDriver.__init__(self, options, service, keep_alive) 44 service = service if service else Service() 45 options = options if options else Options() ---> 47 super().__init__( 48 browser_name=DesiredCapabilities.EDGE["browserName"], 49 vendor_prefix="ms", 50 options=options, 51 service=service, 52 keep_alive=keep_alive, 53 ) File ~\AppData\Roaming\Python\Python313\site-packages\selenium\webdriver\chromium\webdriver.py:53, in ChromiumDriver.__init__(self, browser_name, vendor_prefix, options, service, keep_alive) 50 self.service = service 52 finder = DriverFinder(self.service, options) ---> 53 if finder.get_browser_path(): 54 options.binary_location = finder.get_browser_path() 55 options.browser_version = None File ~\AppData\Roaming\Python\Python313\site-packages\selenium\webdriver\common\driver_finder.py:47, in DriverFinder.get_browser_path(self) 46 def get_browser_path(self) -> str: ---> 47 return self._binary_paths()["browser_path"] File ~\AppData\Roaming\Python\Python313\site-packages\selenium\webdriver\common\driver_finder.py:78, in DriverFinder._binary_paths(self) 76 except Exception as err: 77 msg = f"Unable to obtain driver for {browser}" ---> 78 raise NoSuchDriverException(msg) from err 79 return self._paths NoSuchDriverException: Message: Unable to obtain driver for MicrosoftEdge; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/driver_location
最新发布
08-09
<think>我们遇到了两个主要问题: 1. 使用webdriver-manager时,尝试获取Edge驱动版本时发生错误:ValueError: There is no such driver by url https://msedgedriver.azureedge.net/LATEST_RELEASE_138_WINDOWS 2. 当webdriver-manager失败后,尝试使用默认路径(Windows和Linux/Mac)也失败了,因为默认路径下没有msedgedriver。 原因分析: 第一个错误可能是因为webdriver-manager尝试获取的版本号(138)在微软的驱动存储中不存在。这可能是由于Edge浏览器版本号与驱动版本号不匹配,或者微软的URL发生了变化。 第二个错误是因为在默认路径下没有找到msedgedriver.exe(Windows)或msedgedriver(Mac/Linux)。 解决方案: 1. 我们需要确保Edge浏览器已安装,并且获取其准确的版本号。 2. 使用webdriver-manager时,我们可以指定版本号,避免它尝试获取一个不存在的版本。 3. 如果自动安装失败,我们可以提示用户手动下载并配置驱动。 修改后的初始化函数将包括: - 获取已安装Edge浏览器的版本号 - 使用webdriver-manager安装对应版本的驱动(如果知道版本) - 如果自动安装失败,则尝试从系统路径中查找(包括常见路径) - 如果仍然失败,提示用户手动下载并配置 另外,我们注意到在异常处理中,我们尝试了Windows路径和Linux/Mac路径,但这两个路径可能都不正确。我们需要更智能地查找驱动。 我们将编写一个函数来获取Edge浏览器的版本,然后使用该版本号来安装驱动。同时,我们将添加一个函数来在常见路径中搜索驱动。 由于代码较长,我们将重新组织代码,包括以下函数: 1. get_edge_version(): 获取已安装的Edge浏览器版本 2. find_edge_driver(): 在常见路径中查找msedgedriver 3. install_edge_driver_with_manager(version): 使用webdriver-manager安装指定版本的驱动 4. download_edge_driver_manually(version): 提示用户手动下载驱动 然后,在init_edge_driver函数中,我们将按顺序尝试: a. 使用webdriver-manager自动安装(使用获取到的版本号) b. 在常见路径中查找驱动 c. 提示用户手动下载 注意:由于Edge浏览器版本更新频繁,我们需要确保驱动版本与浏览器版本匹配。 我们将修改代码,如下所示:</think># 解决 Selenium Edge 驱动初始化失败问题 您遇到的错误是由于 Selenium 无法正确加载 Microsoft Edge 驱动程序引起的。主要问题有两个: 1. `webdriver-manager` 尝试从 `https://msedgedriver.azureedge.net/LATEST_RELEASE_138_WINDOWS` 获取驱动版本失败 2. 手动指定的驱动路径无效(`C:/Program Files (x86)/Microsoft/Edge/Application/msedgedriver.exe` 和 `/usr/local/bin/msedgedriver` 都不存在) 以下是完整的解决方案,包含修复后的代码: ```python import os import sys import subprocess import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.edge.service import Service from selenium.webdriver.edge.options import Options 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 NoSuchDriverException, SessionNotCreatedException def get_edge_version(): """获取已安装的Edge浏览器版本""" try: if sys.platform == 'win32': # Windows系统 cmd = r'reg query "HKEY_CURRENT_USER\Software\Microsoft\Edge\BLBeacon" /v version' output = subprocess.check_output(cmd, shell=True, text=True, stderr=subprocess.DEVNULL) return output.split()[-1] elif sys.platform == 'darwin': # macOS系统 cmd = '/Applications/Microsoft\ Edge.app/Contents/MacOS/Microsoft\ Edge --version' output = subprocess.check_output(cmd, shell=True, text=True, stderr=subprocess.DEVNULL) return output.strip().split()[-1] else: # Linux系统 cmd = 'microsoft-edge --version' output = subprocess.check_output(cmd, shell=True, text=True, stderr=subprocess.DEVNULL) return output.strip().split()[-1] except Exception as e: print(f"获取Edge版本失败: {e}") return None def find_edge_driver(): """尝试在常见路径中查找Edge驱动程序""" # Windows系统路径 windows_paths = [ r"C:\Program Files (x86)\Microsoft\Edge\Application\msedgedriver.exe", r"C:\Program Files\Microsoft\Edge\Application\msedgedriver.exe", r"C:\Windows\System32\msedgedriver.exe", os.path.join(os.getenv("LOCALAPPDATA"), "Microsoft", "Edge SxS", "Application", "msedgedriver.exe") ] # macOS系统路径 mac_paths = [ "/usr/local/bin/msedgedriver", "/Applications/Microsoft Edge.app/Contents/MacOS/msedgedriver", os.path.expanduser("~/bin/msedgedriver") ] # Linux系统路径 linux_paths = [ "/usr/bin/msedgedriver", "/usr/local/bin/msedgedriver", "/opt/microsoft/msedge/msedgedriver" ] # 根据系统选择路径列表 paths_to_check = [] if sys.platform == 'win32': paths_to_check = windows_paths elif sys.platform == 'darwin': paths_to_check = mac_paths else: paths_to_check = linux_paths # 检查路径是否存在 for path in paths_to_check: if os.path.isfile(path): print(f"找到Edge驱动: {path}") return path print("未找到Edge驱动程序") return None def install_edge_driver_with_manager(version=None): """使用webdriver-manager安装Edge驱动""" try: from webdriver_manager.microsoft import EdgeChromiumDriverManager print("尝试使用webdriver-manager安装Edge驱动...") # 如果指定版本则使用该版本,否则自动检测 if version: driver_path = EdgeChromiumDriverManager(version=version).install() else: driver_path = EdgeChromiumDriverManager().install() print(f"webdriver-manager安装成功: {driver_path}") return driver_path except Exception as e: print(f"webdriver-manager安装失败: {e}") return None def download_edge_driver_manually(version): """手动下载Edge驱动程序""" print("请手动下载匹配的Edge驱动程序:") print(f"1. 打开 https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/") print(f"2. 下载与您的Edge浏览器版本匹配的驱动程序 (检测到版本: {version})") if sys.platform == 'win32': print("3. 解压下载的msedgedriver.exe文件") print("4. 将其放在以下位置之一:") print(" - C:\\Windows\\System32") print(" - C:\\Program Files (x86)\\Microsoft\\Edge\\Application") print(" - 或添加到系统PATH环境变量") else: print("3. 解压下载的文件") print("4. 将其移动到/usr/local/bin目录:") print(" sudo mv msedgedriver /usr/local/bin/") print(" sudo chmod +x /usr/local/bin/msedgedriver") input("按Enter键继续...") return find_edge_driver() def configure_edge_options(): """配置Edge浏览器选项""" options = Options() options.add_argument("--start-maximized") # 最大化窗口 options.add_argument("--disable-notifications") # 禁用通知 # options.add_argument("--headless") # 无头模式(可选) options.add_experimental_option("excludeSwitches", ["enable-automation"]) # 隐藏自动化控制提示 options.add_experimental_option("useAutomationExtension", False) # 禁用自动化扩展 return options def init_edge_driver(): """初始化Edge浏览器驱动 - 修复版""" # 获取浏览器版本 edge_version = get_edge_version() print(f"检测到Edge浏览器版本: {edge_version}") # 尝试查找现有驱动 driver_path = find_edge_driver() # 如果未找到,尝试使用webdriver-manager安装 if not driver_path: driver_path = install_edge_driver_with_manager(edge_version) # 如果仍然未找到,提示手动下载 if not driver_path: driver_path = download_edge_driver_manually(edge_version) if driver_path: try: # 配置服务 service = Service(executable_path=driver_path) # 创建浏览器实例 driver = webdriver.Edge(service=service, options=configure_edge_options()) print("Edge浏览器初始化成功!") return driver except SessionNotCreatedException as e: print(f"会话创建失败: {e}") print("通常是由于浏览器和驱动版本不匹配导致") # 尝试重新安装匹配版本 driver_path = install_edge_driver_with_manager(edge_version) if driver_path: service = Service(executable_path=driver_path) return webdriver.Edge(service=service, options=configure_edge_options()) else: raise else: raise NoSuchDriverException("无法找到或安装Edge驱动程序") # 初始化浏览器 try: driver = init_edge_driver() except Exception as e: print(f"初始化Edge浏览器失败: {e}") print("请按照上述提示手动安装Edge驱动程序") exit(1) try: # 1. 打开网页 print("打开百度首页...") driver.get("https://www.baidu.com") # 2. 获取页面标题和URL print(f"页面标题: {driver.title}") print(f"当前URL: {driver.current_url}") # 3. 定位元素并输入搜索词 search_box = driver.find_element(By.ID, "kw") search_box.send_keys("Selenium Edge浏览器自动化") # 4. 提交搜索表单 search_box.submit() # 5. 显式等待结果加载 print("等待搜索结果加载...") WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "content_left")) ) # 6. 获取搜索结果数量 result_stats = driver.find_element(By.CLASS_NAME, "nums_text").text print(f"搜索结果: {result_stats}") # 7. 点击第一个搜索结果 first_result = driver.find_element(By.CSS_SELECTOR, "#content_left .result-op h3 a") first_result.click() # 8. 切换到新标签页 print("切换到新标签页...") driver.switch_to.window(driver.window_handles[-1]) # 9. 页面滚动 print("滚动页面...") driver.execute_script("window.scrollTo(0, document.body.scrollHeight/2);") time.sleep(1) driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(1) driver.execute_script("window.scrollTo(0, 0);") # 10. 鼠标悬停操作 print("执行鼠标悬停操作...") try: # 尝试在页面上找到可悬停的元素 hover_element = driver.find_element(By.CSS_SELECTOR, "nav a") ActionChains(driver).move_to_element(hover_element).perform() time.sleep(1) except: print("未找到可悬停元素,跳过此步骤") # 11. 浏览器导航操作 print("浏览器导航操作...") driver.back() # 返回上一页 time.sleep(1) driver.forward() # 前进 time.sleep(1) driver.refresh() # 刷新页面 time.sleep(1) # 12. 处理弹窗 print("处理JavaScript弹窗...") # 触发一个alert弹窗 driver.execute_script("alert('这是Selenium测试弹窗!');") # 切换到弹窗并接受 alert = driver.switch_to.alert print(f"弹窗内容: {alert.text}") alert.accept() # 13. 操作浏览器窗口 print("操作浏览器窗口...") # 获取当前窗口大小 print(f"当前窗口尺寸: {driver.get_window_size()}") # 设置窗口大小 driver.set_window_size(800, 600) time.sleep(1) # 最大化窗口 driver.maximize_window() time.sleep(1) # 14. 获取页面截图 print("保存页面截图...") driver.save_screenshot("selenium_screenshot.png") # 15. 获取页面源码 # print("获取页面源码...") # page_source = driver.page_source # with open("page_source.html", "w", encoding="utf-8") as f: # f.write(page_source) print("所有基础操作执行完成!") finally: # 16. 关闭浏览器 input("按Enter键关闭浏览器...") # 用于演示时查看结果 driver.quit() print("浏览器已关闭") ``` ## 问题分析与解决方案详解 ### 问题1: `ValueError: There is no such driver by url...` **原因分析**: - `webdriver-manager` 尝试从 `https://msedgedriver.azureedge.net/LATEST_RELEASE_138_WINDOWS` 获取驱动版本 - 但微软可能已更改URL格式或不再支持该版本号(138)的驱动 - 这通常发生在Edge浏览器版本与驱动版本不匹配时 **解决方案**: 1. **获取准确的Edge版本**: ```python def get_edge_version(): """获取已安装的Edge浏览器版本""" try: if sys.platform == 'win32': cmd = r'reg query "HKEY_CURRENT_USER\Software\Microsoft\Edge\BLBeacon" /v version' output = subprocess.check_output(cmd, shell=True, text=True, stderr=subprocess.DEVNULL) return output.split()[-1] # ... 其他平台类似 except Exception as e: print(f"获取Edge版本失败: {e}") return None ``` 2. **使用正确版本安装驱动**: ```python def install_edge_driver_with_manager(version=None): """使用webdriver-manager安装Edge驱动""" try: from webdriver_manager.microsoft import EdgeChromiumDriverManager if version: driver_path = EdgeChromiumDriverManager(version=version).install() else: driver_path = EdgeChromiumDriverManager().install() return driver_path except Exception as e: print(f"webdriver-manager安装失败: {e}") return None ``` ### 问题2: `ValueError: The path is not a valid file...` **原因分析**: - 代码尝试的默认路径 (`C:/Program Files (x86)/Microsoft/Edge/Application/msedgedriver.exe`) 不存在 - 这是因为Edge驱动通常不随浏览器安装,需要单独下载 **解决方案**: 1. **智能查找驱动**: ```python def find_edge_driver(): """尝试在常见路径中查找Edge驱动程序""" # Windows系统路径列表 windows_paths = [ r"C:\Program Files (x86)\Microsoft\Edge\Application\msedgedriver.exe", r"C:\Program Files\Microsoft\Edge\Application\msedgedriver.exe", r"C:\Windows\System32\msedgedriver.exe", os.path.join(os.getenv("LOCALAPPDATA"), "Microsoft", "Edge SxS", "Application", "msedgedriver.exe") ] # ... macOS和Linux路径 # 检查路径是否存在 for path in paths_to_check: if os.path.isfile(path): return path return None ``` 2. **提供手动下载指导**: ```python def download_edge_driver_manually(version): """手动下载Edge驱动程序""" print("请手动下载匹配的Edge驱动程序:") print(f"1. 打开 https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/") print(f"2. 下载与您的Edge浏览器版本匹配的驱动程序 (检测到版本: {version})") # ... 具体平台指导 input("按Enter键继续...") return find_edge_driver() ``` ### 增强的错误处理 ```python def init_edge_driver(): """初始化Edge浏览器驱动 - 修复版""" # 获取浏览器版本 edge_version = get_edge_version() # 尝试多种方式获取驱动路径 driver_path = find_edge_driver() if not driver_path: driver_path = install_edge_driver_with_manager(edge_version) if not driver_path: driver_path = download_edge_driver_manually(edge_version) if driver_path: try: service = Service(executable_path=driver_path) driver = webdriver.Edge(service=service, options=configure_edge_options()) return driver except SessionNotCreatedException: # 处理版本不匹配问题 driver_path = install_edge_driver_with_manager(edge_version) if driver_path: service = Service(executable_path=driver_path) return webdriver.Edge(service=service, options=configure_edge_options()) else: raise else: raise NoSuchDriverException("无法找到或安装Edge驱动程序") ``` ## 使用替代方案:直接下载驱动 如果上述方法仍然失败,可以使用这个更可靠的方法: ```python import requests import zipfile import tarfile import io import os def download_edge_driver_directly(version): """直接下载并解压Edge驱动""" # 根据平台确定下载URL if sys.platform == 'win32': url = f"https://msedgedriver.azureedge.net/{version}/edgedriver_win64.zip" elif sys.platform == 'darwin': if 'arm' in os.uname().machine: url = f"https://msedgedriver.azureedge.net/{version}/edgedriver_mac64_m1.zip" else: url = f"https://msedgedriver.azureedge.net/{version}/edgedriver_mac64.zip" else: url = f"https://msedgedriver.azureedge.net/{version}/edgedriver_linux64.tar.gz" print(f"正在从 {url} 下载驱动...") response = requests.get(url) # 创建目标目录 target_dir = os.path.join(os.getcwd(), "edgedriver") os.makedirs(target_dir, exist_ok=True) if sys.platform == 'win32' or sys.platform == 'darwin': # 处理zip文件 with zipfile.ZipFile(io.BytesIO(response.content)) as zip_ref: zip_ref.extractall(target_dir) # 找到驱动文件 for file in zip_ref.namelist(): if "msedgedriver" in file or "edgedriver" in file: driver_path = os.path.join(target_dir, file) break else: # 处理tar.gz文件 with tarfile.open(fileobj=io.BytesIO(response.content), mode="r:gz") as tar_ref: tar_ref.extractall(target_dir) for member in tar_ref.getmembers(): if "msedgedriver" in member.name or "edgedriver" in member.name: driver_path = os.path.join(target_dir, member.name) break # 设置执行权限 if sys.platform != 'win32': os.chmod(driver_path, 0o755) print(f"驱动已安装到: {driver_path}") return driver_path ``` ## 最佳实践建议 1. **版本锁定**: ```python # 在项目中固定浏览器和驱动版本 EDGE_VERSION = "115.0.1901.203" # 安装指定版本 driver_path = install_edge_driver_with_manager(EDGE_VERSION) ``` 2. **驱动健康检查**: ```python def check_driver_health(driver_path): """检查驱动是否可用""" try: result = subprocess.run( [driver_path, "--version"], capture_output=True, text=True, timeout=5 ) return "MSEdgeDriver" in result.stdout except: return False ``` 3. **自动修复机制**: ```python def robust_driver_init(max_retries=3): for attempt in range(max_retries): try: return init_edge_driver() except Exception as e: print(f"初始化失败 (尝试 {attempt+1}/{max_retries}): {e}") if "driver" in str(e).lower(): # 尝试重新安装驱动 reinstall_edge_driver() raise Exception("无法初始化Edge驱动") ``` 4. **使用虚拟环境**: ```bash # 创建虚拟环境 python -m venv selenium-env source selenium-env/bin/activate # Linux/macOS .\selenium-env\Scripts\activate # Windows # 安装依赖 pip install selenium webdriver-manager requests ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值