createBrowserDriver.py 8.77 KB
Newer Older
liyang's avatar
liyang committed
1 2
import os
import platform
3
import sys
liyang's avatar
liyang committed
4
from utils.Logger import log
liyang's avatar
liyang committed
5
from selenium import webdriver
liyang's avatar
liyang committed
6
# ---------------   selenium 依赖 start ----------------
7
from selenium.webdriver.chrome.service import Service as ChromeService
liyang's avatar
liyang committed
8
from selenium.webdriver.chromium.service import ChromiumService
9
from selenium.webdriver.firefox.service import Service as FirefoxService
liyang's avatar
liyang committed
10 11 12 13 14
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
liyang's avatar
liyang committed
15 16
# ---------------   selenium 依赖 end ----------------

liyang's avatar
liyang committed
17 18 19 20 21 22 23
# ---------------  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  -----------------

liyang's avatar
liyang committed
24
from utils.index import get_screen_resolution
liyang's avatar
liyang committed
25

liyang's avatar
liyang committed
26
# from mozprofile import FirefoxProfile
liyang's avatar
liyang committed
27 28 29 30 31
'''
创建浏览器实例
'''


liyang's avatar
liyang committed
32
def create(option=None, no_headless=False, using_user_data=True, web_browser="chrome"):
liyang's avatar
liyang committed
33
    """
34
    生成selenium实例
liyang's avatar
liyang committed
35

36
    :param no_headless:
liyang's avatar
liyang committed
37
    :param web_browser:
38
    :param using_user_data:
liyang's avatar
liyang committed
39 40 41
    :param option:
    :return:
    """
liyang's avatar
liyang committed
42

liyang's avatar
liyang committed
43
    # 安装或升级 chromedriver
liyang's avatar
liyang committed
44
    # chromedriver_autoinstaller.install()
liyang's avatar
liyang committed
45

liyang's avatar
liyang committed
46 47
    options = ""
    browser = ""
liyang's avatar
liyang committed
48 49
    # 获取现有Chrome浏览器用户数据目录
    user_data_dir = os.path.join(os.path.abspath("../"), 'network-assets-reptile', 'user_data')
liyang's avatar
liyang committed
50 51
    if web_browser == "firefox":
        options = webdriver.FirefoxOptions()
liyang's avatar
liyang committed
52
    elif web_browser == "chrome" or web_browser == "chrome_test":
liyang's avatar
liyang committed
53
        options = webdriver.ChromeOptions()
liyang's avatar
liyang committed
54 55
    elif web_browser == "edge":
        options = webdriver.EdgeOptions()
liyang's avatar
liyang committed
56 57
    elif web_browser == "chromium":
        options = webdriver.ChromeOptions()
58

liyang's avatar
liyang committed
59 60
    if option is not None:
        for value in option:
liyang's avatar
liyang committed
61
            options.add_argument(value)
liyang's avatar
liyang committed
62

63
    if using_user_data:
liyang's avatar
liyang committed
64 65
        # 添加用户数据目录参数,启用浏览器的持久性会话,可以保存登录状态和Cookie
        if web_browser == "firefox":
liyang's avatar
liyang committed
66
            # 将此处替换为你的Firefox用户数据目录路径
liyang's avatar
liyang committed
67 68 69 70
            # profile = FirefoxProfile(profile_directory=user_data_dir)
            # options.profile = profile
            options.add_argument("-profile")
            options.add_argument(user_data_dir)
71
            # options.add_argument(f'--user-data-dir={user_data_dir}')
liyang's avatar
liyang committed
72
        elif web_browser == "chrome":
liyang's avatar
liyang committed
73
            options.add_argument(f'--user-data-dir={user_data_dir}')
liyang's avatar
liyang committed
74
        elif web_browser == "chromium":
liyang's avatar
liyang committed
75 76 77
            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}')
liyang's avatar
liyang committed
78 79
        elif web_browser == "edge":
            options.add_argument(f'--user-data-dir={user_data_dir}')
liyang's avatar
liyang committed
80 81
        else:
            print("")
liyang's avatar
liyang committed
82

liyang's avatar
liyang committed
83 84 85 86
    # if sys.platform.startswith('linux'):
    # print("当前系统是 Linux")
    # linux下运行记得加上这些参数 ----------------------------
    # chrome_options.add_argument('--headless')
liyang's avatar
liyang committed
87
    # options.add_argument("--window-size=1920x1080")  # 设置窗口大小,这是一个常见的完全无头模式的设置
liyang's avatar
liyang committed
88
    # options.add_argument("--start-maximized")  # 最大化窗口
liyang's avatar
liyang committed
89 90
    options.add_argument("--no-sandbox")
    if no_headless:
91
        if platform.system() == "Linux" or platform.system() == "Darwin":
92
            # 开启无头模式
liyang's avatar
liyang committed
93
            options.add_argument("--headless")
94 95
        elif platform.system() == "Windows" and web_browser == "firefox":
            # windows系统、火狐浏览器不开启无头模式
liyang's avatar
liyang committed
96 97
            # print("")
            error = ""
98

liyang's avatar
liyang committed
99
    if no_headless:
100 101 102 103
        # 无头模式下禁用gpu加速
        options.add_argument('--disable-gpu')

    # 无头模式-linux 系统
liyang's avatar
liyang committed
104
    if no_headless and platform.system() == "Linux":
105 106 107 108 109 110
        '''
            --disable-dev-shm-usage 是 Chrome 浏览器在无头模式下运行时的一个常用启动参数。在 Linux 系统下特别常见,通过这个参数,Chrome 浏览器会禁用对 /dev/shm 的使用。
        '''
        options.add_argument('--disable-dev-shm-usage')
        # 禁用沙盒模式
        options.add_argument('--no-sandbox')
liyang's avatar
liyang committed
111 112 113 114 115
    # 加载chromedriver -------------------------------------------------
    # windows 下的 chromedriver 默认加载路径是当前路径下的 chromedriver.exe
    # linux 下的 chromedriver 默认加载路径是 /usr/local/bin/chromedriver
    # 当然也可以通过 executable_path 自定义
    if web_browser == "firefox":
116
        # 创建Firefox浏览器对象并传入选
117 118 119 120 121 122 123
        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":
liyang's avatar
liyang committed
124 125 126 127 128 129
            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,
130 131
            browser = webdriver.Firefox(options=options, service=service)
        elif platform.system() == "Darwin":
liyang's avatar
liyang committed
132 133 134 135
            service = FirefoxService(
                executable_path=os.path.join(os.path.abspath("../"), 'network-assets-reptile', 'browser', "web-driver",
                                             "firefox", "mac",
                                             "geckodriver"))
136
            browser = webdriver.Firefox(options=options, service=service)
liyang's avatar
liyang committed
137
    elif web_browser == "chrome":
liyang's avatar
liyang committed
138
        # 创建Chrome浏览器对象并传入选项
liyang's avatar
liyang committed
139 140 141
        if platform.system() == "Darwin":
            options.binary_location = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
        browser = webdriver.Chrome(options=options, service=ChromeService())
liyang's avatar
liyang committed
142
    elif web_browser == "chromium":
liyang's avatar
liyang committed
143
        binary_location = ""
liyang's avatar
liyang committed
144
        webdriver_location = ""
liyang's avatar
liyang committed
145
        if platform.system() == "Windows":
liyang's avatar
liyang committed
146 147
            binary_location = os.path.join(os.path.abspath("../"), 'network-assets-reptile', 'browser', "chrome_win64",
                                           "chrome.exe")
148 149 150
            webdriver_location = os.path.join(os.path.abspath("../"), 'network-assets-reptile', 'browser', "web-driver",
                                              "chromedriver_win32",
                                              "chromedriver.exe")
liyang's avatar
liyang committed
151 152 153
        elif platform.system() == "Linux":
            binary_location = os.path.join(os.path.abspath("../"), 'network-assets-reptile', 'browser',
                                           "chrome-linux64", "chrome")
154 155 156
            webdriver_location = os.path.join(os.path.abspath("../"), 'network-assets-reptile', 'browser', "web-driver",
                                              "chromedriver_linux64",
                                              "chromedriver")
liyang's avatar
liyang committed
157 158
        elif platform.system() == "Darwin":
            binary_location = os.path.join(os.path.abspath("../"), 'network-assets-reptile', 'browser',
liyang's avatar
liyang committed
159
                                           "chrome-mac-x64", "chrome.app")
160 161 162
            webdriver_location = os.path.join(os.path.abspath("../"), 'network-assets-reptile', 'browser', "web-driver",
                                              "chromedriver_mac64",
                                              "chromedriver")
liyang's avatar
liyang committed
163
        else:
liyang's avatar
liyang committed
164
            error = ""
liyang's avatar
liyang committed
165 166 167 168
        # 设置驱动二进制可执行文件路径
        # service = ChromeService(executable_path=webdriver_location)
        service = ChromeService(executable_path=webdriver_location)
        # service=service=ChromeService(ChromeDriverManager().install())
169
        browser = webdriver.Chrome(options=options, service=service)
liyang's avatar
liyang committed
170
    elif web_browser == "edge":
171
        browser = webdriver.Edge(options=options, service=EdgeService(EdgeChromiumDriverManager().install()))
liyang's avatar
liyang committed
172
    else:
liyang's avatar
liyang committed
173 174 175 176 177 178 179 180 181
        error = ""

    # 获取浏览器信息
    browser_name = browser.capabilities['browserName']
    browser_version = browser.capabilities['browserVersion']

    # 输出浏览器信息
    print("浏览器名称:", browser_name)
    print("浏览器版本:", browser_version)
liyang's avatar
liyang committed
182

183 184 185 186 187 188
    if option is None:
        # 获取屏幕分辨率
        width, height = get_screen_resolution()
        # 设置窗口大小为全屏
        browser.set_window_size(width, height)

liyang's avatar
liyang committed
189
    return browser