【web自动化】selenium根据浏览器版本下载对应的chromedriver
1、使用国内的镜像地址
https://registry.npmmirror.com/binary.html?path=chromedriver/
2、通过simulation模拟用户点击来下载(只贴出部分方法)
#!/usr/bin/env python # -*- coding:utf-8 -*- import os import platform import signal import time import allure import requests from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait DRIVER_DOWNLOAD_URL = "https://registry.npmmirror.com/binary.html?path=chromedriver/" class BaseAction(object): def __init__(self, mode=0): """ :param mode: 0: 表示无头模式 """ self.mode = mode self.options = webdriver.ChromeOptions() self.serv = Service(executable_path=r"{}".format(self.get_driver_path_by_sys())) self.serv.start() self.options.add_argument('--headless') self.options.add_argument('--disable-gpu') if self.sys_type == 'Windows': self.browser = webdriver.Chrome(service=self.serv, options=self.options) else: self.browser = webdriver.Chrome(executable_path=self.get_driver_path_by_sys(), options=self.options) self.browser_version = self.get_browser_ver() def get_driver_path_by_sys(self): self.sys_type = platform.system() if self.sys_type == "Windows": debug_logger.info("[web] system type: Windows") return os.path.join(PROJECT_ROOT_PATH, 'third_party', 'chromedriver', 'chromedriver_win32', 'chromedriver.exe') elif self.sys_type == "Linux": debug_logger.info("[web] system type: Linux") return os.path.join(PROJECT_ROOT_PATH, 'third_party', 'chromedriver', 'chromedriver_linux64', 'chromedriver') else: raise Exception("[web]system not support!") def get_browser_ver(self): self.open_url("http://www.baidu.com/") time.sleep(1) logger.info("[web]浏览器version:{}".format(self.browser.capabilities.get("browserVersion"))) return self.browser.capabilities.get("browserVersion") def open_url(self, url): self.browser.get(url) time.sleep(2) self.wait = WebDriverWait(self.browser, 20) self.browser.maximize_window()def close(self): time.sleep(2) self.browser.close() self.browser.quit() self.serv.stop() def get_driver_uri(self): # 获取webdriver下载列表 self.open_url(DRIVER_DOWNLOAD_URL) # 下载并更新当前webdriver列表 ele = self.browser.find_elements(By.XPATH, '/html/body/table/tbody/tr/td/a') like_version_list = [] for e in ele: if e.text.startswith(self.browser_version.rsplit(".", 1)[0]): like_version_list.append(e.text) logger.info(f'[web] like_version_list: {like_version_list}') # 获取最新版本 logger.info(f'[web] version_uri: {max(like_version_list)}') version_uri = max(like_version_list) return version_uri def get_system_download_url(self): version_uri = self.get_driver_uri() self.open_url(DRIVER_DOWNLOAD_URL + version_uri) ele = self.browser.find_elements(By.XPATH, '/html/body/table/tbody/tr/td/a') url_list = [e.get_attribute('href') for e in ele] logger.info(f'[web] url_list: {url_list}') if platform.system() == "Windows": download_url = [d_url for d_url in url_list if "win" in d_url][0] elif platform.system() == "Linux": download_url = [d_url for d_url in url_list if "linux" in d_url][0] else: download_url = None logger.info(f'[web] download_url: {download_url}') return download_url def download_driver_to_local(self): download_url = self.get_system_download_url() rsp = requests.get(download_url) # 删除本地driver文件 driver_path = self.get_driver_path_by_sys() # 关闭占用 self.close() driver_dir = os.path.dirname(driver_path) logger.info(f'[web] dir content: {os.listdir(driver_dir)}') p_pid = get_pid("chromedriver.exe") if p_pid: os.kill(p_pid, signal.SIGINT) os.unlink(driver_path) # 写入下载的文件 file_name = download_url.rsplit("/", 1)[-1] file_dir = os.path.join(driver_dir, file_name) with open(file_dir, mode='wb') as f: f.write(rsp.content) logger.info(f'[web] dir content: {os.listdir(driver_dir)}') # 解压文件到当前目录 unzip_file(file_dir, driver_dir) if __name__ == '__main__': action = BaseAction(mode=0) action.download_driver_to_local()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?