import os import platform import sys from utils.Logger import log from selenium import webdriver # --------------- selenium 依赖 start ---------------- from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.chromium.service import ChromiumService from selenium.webdriver.firefox.service import Service as FirefoxService from selenium.webdriver.edge.service import Service as EdgeService from selenium.webdriver.ie.service import Service as IeService from selenium.webdriver.safari.service import Service as SafariService from selenium.webdriver.firefox.firefox_profile import FirefoxProfile # --------------- selenium 依赖 end ---------------- # --------------- webdriver_manager 依赖 start ----------------- from webdriver_manager.chrome import ChromeDriverManager from webdriver_manager.firefox import GeckoDriverManager from webdriver_manager.microsoft import EdgeChromiumDriverManager from webdriver_manager.opera import OperaDriverManager # --------------- webdriver_manager 依赖 end ----------------- from utils.index import get_screen_resolution # from mozprofile import FirefoxProfile ''' 创建浏览器实例 ''' def create(option=None, no_headless=False, using_user_data=True, web_browser="chrome"): """ 生成selenium实例 :param no_headless: :param web_browser: :param using_user_data: :param option: :return: """ # 安装或升级 chromedriver # chromedriver_autoinstaller.install() options = "" browser = "" # 获取现有Chrome浏览器用户数据目录 user_data_dir = os.path.join(os.path.abspath("../"), 'network-assets-reptile', 'user_data') if web_browser == "firefox": options = webdriver.FirefoxOptions() elif web_browser == "chrome" or web_browser == "chrome_test": options = webdriver.ChromeOptions() elif web_browser == "edge": options = webdriver.EdgeOptions() elif web_browser == "chromium": options = webdriver.ChromeOptions() if option is not None: for value in option: options.add_argument(value) if using_user_data: # 添加用户数据目录参数,启用浏览器的持久性会话,可以保存登录状态和Cookie if web_browser == "firefox": # 将此处替换为你的Firefox用户数据目录路径 # profile = FirefoxProfile(profile_directory=user_data_dir) # options.profile = profile options.add_argument("-profile") options.add_argument(user_data_dir) # options.add_argument(f'--user-data-dir={user_data_dir}') elif web_browser == "chrome": options.add_argument(f'--user-data-dir={user_data_dir}') elif web_browser == "chromium": options.add_argument(f'--user-data-dir={user_data_dir}') elif web_browser == "chrome_test": options.add_argument(f'--user-data-dir={user_data_dir}') elif web_browser == "edge": options.add_argument(f'--user-data-dir={user_data_dir}') else: print("") # if sys.platform.startswith('linux'): # print("当前系统是 Linux") # linux下运行记得加上这些参数 ---------------------------- # chrome_options.add_argument('--headless') # options.add_argument("--window-size=1920x1080") # 设置窗口大小,这是一个常见的完全无头模式的设置 # options.add_argument("--start-maximized") # 最大化窗口 options.add_argument("--no-sandbox") if no_headless: if platform.system() == "Linux" or platform.system() == "Darwin": # 开启无头模式 options.add_argument("--headless") elif platform.system() == "Windows" and web_browser == "firefox": # windows系统、火狐浏览器不开启无头模式 # print("") error = "" if no_headless: # 无头模式下禁用gpu加速 options.add_argument('--disable-gpu') # 无头模式-linux 系统 if no_headless and platform.system() == "Linux": ''' --disable-dev-shm-usage 是 Chrome 浏览器在无头模式下运行时的一个常用启动参数。在 Linux 系统下特别常见,通过这个参数,Chrome 浏览器会禁用对 /dev/shm 的使用。 ''' options.add_argument('--disable-dev-shm-usage') # 禁用沙盒模式 options.add_argument('--no-sandbox') # 加载chromedriver ------------------------------------------------- # windows 下的 chromedriver 默认加载路径是当前路径下的 chromedriver.exe # linux 下的 chromedriver 默认加载路径是 /usr/local/bin/chromedriver # 当然也可以通过 executable_path 自定义 if web_browser == "firefox": # 创建Firefox浏览器对象并传入选 if platform.system() == "Windows": service = FirefoxService( executable_path=os.path.join(os.path.abspath("../"), 'network-assets-reptile', 'browser', "web-driver", "firefox", "windows", "geckodriver.exe")) browser = webdriver.Firefox(options=options, service=service) elif platform.system() == "Linux": path = os.path.join(os.path.abspath("../"), 'network-assets-reptile', 'browser', "web-driver", "firefox", "linux", "geckodriver") service = FirefoxService(executable_path=path) log.debug("firefox驱动路径:" + path) # options=options, browser = webdriver.Firefox(options=options, service=service) elif platform.system() == "Darwin": service = FirefoxService( executable_path=os.path.join(os.path.abspath("../"), 'network-assets-reptile', 'browser', "web-driver", "firefox", "mac", "geckodriver")) browser = webdriver.Firefox(options=options, service=service) elif web_browser == "chrome": # 创建Chrome浏览器对象并传入选项 if platform.system() == "Darwin": options.binary_location = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" browser = webdriver.Chrome(options=options, service=ChromeService()) elif web_browser == "chromium": binary_location = "" webdriver_location = "" if platform.system() == "Windows": binary_location = os.path.join(os.path.abspath("../"), 'network-assets-reptile', 'browser', "chrome_win64", "chrome.exe") webdriver_location = os.path.join(os.path.abspath("../"), 'network-assets-reptile', 'browser', "web-driver", "chromedriver_win32", "chromedriver.exe") elif platform.system() == "Linux": binary_location = os.path.join(os.path.abspath("../"), 'network-assets-reptile', 'browser', "chrome-linux64", "chrome") webdriver_location = os.path.join(os.path.abspath("../"), 'network-assets-reptile', 'browser', "web-driver", "chromedriver_linux64", "chromedriver") elif platform.system() == "Darwin": binary_location = os.path.join(os.path.abspath("../"), 'network-assets-reptile', 'browser', "chrome-mac-x64", "chrome.app") webdriver_location = os.path.join(os.path.abspath("../"), 'network-assets-reptile', 'browser', "web-driver", "chromedriver_mac64", "chromedriver") else: error = "" # 设置驱动二进制可执行文件路径 # service = ChromeService(executable_path=webdriver_location) service = ChromeService(executable_path=webdriver_location) # service=service=ChromeService(ChromeDriverManager().install()) browser = webdriver.Chrome(options=options, service=service) elif web_browser == "edge": browser = webdriver.Edge(options=options, service=EdgeService(EdgeChromiumDriverManager().install())) else: error = "" # 获取浏览器信息 browser_name = browser.capabilities['browserName'] browser_version = browser.capabilities['browserVersion'] # 输出浏览器信息 print("浏览器名称:", browser_name) print("浏览器版本:", browser_version) if option is None: # 获取屏幕分辨率 width, height = get_screen_resolution() # 设置窗口大小为全屏 browser.set_window_size(width, height) return browser