has no attribute_option

来源:3-5 页面对象开发的第一种实现方式

qq_staythelonel_03501794

2021-07-08

# 浏览器的类型(Chrome,ie,firefox)
# 浏览器启动参数(无头化,最大化,尺寸华)
# 浏览器的属性(显示尺寸,隐式等待/页面加载/js执行时间)
from selenium.webdriver import *
from typing import Type, Union

class BrowserTypeError(Exception):
    def __int__(self, _type):
        self._type = _type

    def __str__(self):
        return f'unsupported browser type:{self._type}'

class BROWSER:
    CHROM_DRIVER_PATH = r'd:\chromedriver.exe'
    EDG_DRIVER_PATH = r'd:\msedgedriver.exe'
    WINDOWS_SIZE = (1024, 768)
    IMP_TIME = 30
    PAGE_LOAD_TIME = 20
    SCRIP_TIME_OUT = 20
    HEAD_LESS = True

    def __int__(self, browser_type: Type[Union[Chrome, Ie, Edge, Firefox]] = Chrome,
                option_type: Type[Union[ChromeOptions, IeOptions, FirefoxOptions]] = ChromeOptions,
                driver_path: str = CHROM_DRIVER_PATH):
        # 类型校验
        if not issubclass(browser_type, (Chrome, Ie, Edge, Firefox)):
            raise BrowserTypeError
        if not issubclass(option_type, (ChromeOptions, IeOptions, FirefoxOptions)):
            raise BrowserTypeError
        if not isinstance(driver_path, str):
            raise TypeError
        self._path = driver_path
        self._browser = browser_type
        self._option = option_type


    # @property装饰器会将方法转换为相同名称的只读属性
    @property
    def options(self):
        '''
        浏览器特定的操作,在子类中实现
        :return:
        '''
        return
    @property
    def browser(self):
        '''
        启动浏览器,返回浏览器实例
        :return:
        '''
        return


class CHROME(BROWSER):
    METHED_MARK = True
    OPTION_MATK = True
    HEAD_LESS = False
    IMP_TIME = 30
    PAGE_LOAD_TIME = 30
    SCRIP_TIME_OUT = 30
    WINDOWS_SIZE = (1920, 900)

    STRAT_MAX = '--start-maximized'
    EXP = {
        # 不会显示正在受到自动软软件控制,移动模拟的形式打开,web时不需要
        'excludeSwitches': ['enable-automation'],
        'mobileEmulation': {'deviceName': 'iphone 6'}
    }

    @property
    def options(self):
        """
        chrome浏览器特有的操作属性
        :return:
        """
        if self.OPTION_MATK:
            # 继承父类的options操作
            chrome_option = self._option()
            chrome_option.add_argument(self.STRAT_MAX)
            for k, v in self.EXP.items():
                chrome_option.add_experimental_option(k, v)
            return chrome_option
        return None


    @property
    def browser(self):
        if self.options:
            chrome = self._browser(self._path, options=self.options)
        else:
            chrome = self._browser(self._path)
        if self.METHED_MARK:
            chrome.implicitly_wait(self.IMP_TIME)
            chrome.set_script_timeout(self.SCRIP_TIME_OUT)
            chrome.set_page_load_timeout(self.PAGE_LOAD_TIME)
            chrome.set_window_size(*self.WINDOWS_SIZE)
            return chrome
        return chrome


with CHROME().browser as _chrome:
    _chrome.get('http://127.0.0.1:80/index.php')
    from time import sleep
    sleep(3)

图片描述请问是哪里写错了?

写回答

1回答

托尼老师

2021-07-09

类BROWSER的构造方法名称写错了,仔细检查一下。

0
1
qq_staythelonel_03501794
好的谢谢老师!!!
2021-07-09
共1条回复

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

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

445 学习 · 157 问题

查看课程