运行报错:不支持浏览器类型
来源: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
相似问题
