运行报错:不支持浏览器类型

来源: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

源码里有一处错误:

//img.mukewang.com/szimg/60f1675309d5789c06890320.jpg

字符串实例的类型校验不能用issubclass,要使用isinstance判断,注意区分类和实例的类型判断的不同。


至于你报的错误,请把IDE的报错截图贴一下,因为我这里运行你的代码并未报错。

0
1
慕仰4560449
谢谢老师,这个改掉了。
2021-07-19
共1条回复

Python自动化测试开发实战,能帮你就业的测试课

开发高扩展、高可用的自动化测试框架,利用好测试自动化技术。

445 学习 · 157 问题

查看课程