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()
原文地址:https://www.cnblogs.com/fireblackman/p/16603250.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。