运行报错:不支持浏览器类型
来源:3-4 继承基类实现浏览器个性化

慕仰4560449
2021-07-16
3-4节课程运行报错: D:\03APPInstaller\Python\Python37\python.exe D:/03APPInstaller/Python/Muke_1/test.pyTraceback (most recent call last): File "D:/03APPInstaller/Python/Muke_1/test.py", line 112, in <module> with Chrome().browser as _chrome: File "D:/03APPInstaller/Python/Muke_1/test.py", line 49, in __init__ raise BrowserTypeError(browser_type)__main__.BrowserTypeError: unsupported browser type: <class 'selenium.webdriver.chrome.webdriver.WebDriver'>Process finished with exit code 1 源码如下: from selenium.webdriver import * from typing import Type, Union import time class BrowserTypeError(Exception): def __init__(self, _type): self._type = _type def __str__(self): return f'unsupported browser type: {self._type}' class BROWSER: # driver地址 CHROME_DRIVER_PATH = './driver/chrome_driver.exe' EDGE_DRIVER_PATH = './driver/edge_driver.exe' FIREFOX_DRIVER_PATH = './driver/gecko_driver.exe' IE_DRIVER_PATH = './driver/IEDriverServer.exe' OPERA_DRIVER_PATH = './driver/opera_driver.exe' WINDOWS_SIZE = (1024, 768) # 定义浏览器的尺寸 IMP_TIME = 30 # 定义隐式等待时间 PAGE_LOAD_TIME = 20 # 定义页面加载时间 SCRIPT_TIME_OUT = 20 # js执行等待时间 HEADLESS = True # 定义浏览器的无头模式为true,以上定义都可以通过继承父类重写来进行修改 def __init__(self, browser_type: Type[Union[Firefox, Chrome, Ie, Edge, Opera]] = Chrome, option_type: Type[Union[FirefoxOptions, ChromeOptions, IeOptions]] = ChromeOptions, driver_path: str = CHROME_DRIVER_PATH): if not issubclass(browser_type, (Firefox, Chrome, Ie, Edge, Opera)): raise BrowserTypeError(browser_type) if not issubclass(option_type, (FirefoxOptions, ChromeOptions, IeOptions)): raise BrowserTypeError(option_type) if not issubclass(driver_path, str): raise TypeError self._path = driver_path self._browser = browser_type self._option = option_type @property def options(self): """ 浏览器特定的操作,在子类中实现 :return: """ return @property def browser(self): """ 启动浏览器,返回浏览器实例 :return: """ return class CHROME(BROWSER): HEADLESS = False # 重写父类属性 IMP_TIME = 30 PAGE_LOAD_TIME = 30 SCRIPT_TIME_OUT = 30 WINDOWS_SIZE = (1920, 900) START_MAX = '--start-maximized' EXP = { 'excludeSwitches': ['enable-automation'], 'mobileEmulation': {'deviceName': 'iPhone 6'} } @property def options(self): chrome_option = self._option() chrome_option.add_argument(self.START_MAX) for k, v in self.EXP.items(): # 把EXP定义的字典类型转化为键值对 chrome_option.add_experimental_option(k, v) # add_experimental_option() chrome_option.headless = self.HEADLESS return chrome_option @property def browser(self): chrome = self._browser(self._path, options=self.options) chrome.implicitly_wait(self.IMP_TIME) # 设置隐式等待时间 chrome.set_script_timeout(self.SCRIPT_TIME_OUT) # 设置js执行等待时间 chrome.set_page_load_timeout(self.PAGE_LOAD_TIME) # 设置页面加载等待时间 # chrome.set_window_size(*self.WINDOWS_SIZE) # 浏览器启动的时候已经设置了最大化启动,所以这一步注释掉 return chrome with CHROME().browser as _chrome: _chrome.get(r'https://jira.souche-inc.com/login.jsp') time.sleep(3)
写回答
1回答
-
托尼老师
2021-07-16
源码里有一处错误:
字符串实例的类型校验不能用issubclass,要使用isinstance判断,注意区分类和实例的类型判断的不同。
至于你报的错误,请把IDE的报错截图贴一下,因为我这里运行你的代码并未报错。
012021-07-19
相似问题