'TestSearch' object has no attribute 'options'

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

慕九州7187113

2021-08-05

bo_demo

import time

from selenium.webdriver import *
from typing import Type, Union

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

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

class BROWSER:
CHROME_DRIVER_PATH = r’D:\Program Files\Python\Python39\Scripts\chromedriver.exe’
IE_DRIVER_PATH = r’C:\Program Files\Internet Explorer\iexplore.exe’
""“窗口大小即显示尺寸”"“
WINDOW_SIZE = (1024, 768)
”"“隐式等待时间”"“
IMP_TIME = 30
"”“页面加载时间”"“
PAGE_LOAD_TIME = 20
"”“JS执行超时时间”"“
SCRIPT_TIME_OUT = 20
"”“浏览器无头化”""
HEADLESS = True

def __init__(self, browser_type: Type[Union[Firefox, Chrome, Ie, Edge, Opera]] = Chrome,
             options_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(options_type, (FirefoxOptions, ChromeOptions, IeOptions)):
        raise BrowserTypeError(options_type)
    if not isinstance(driver_path, str):
        raise TypeError
    self._browser = browser_type
    self._option = options_type
    self._path = driver_path

@property
def options(self):
    """浏览器特定的操作,在子类中实现
    :return:
    """
    return

@property
def broswer(self):
    """启动浏览器,返回浏览器实例
    :return:
    """
    return

class CHROME(BROWSER):
OPTION_MARK = True
METHOD_MARK = True
HEADLESS = False
IMP_TIME = 30
PAGE_LOAD_TIME = 30
SCRIPT_TIME_OUT = 30
WINDOW_SIZE = (1920, 900)
START_MAX = ‘–start-maximized’

""" 
第一行表示: chrome浏览器的左上角不会展示  chrome浏览器当前正在受到自动化软件控制  这一行提示
第二行表示:chrome会以移动模拟的形式打开某个网页,一般做普通web测试时,这个参数一般不用。当在使用h5网页的时候,需要在浏览器中实现的话,就需要这个参数
"""
EXP = {
    'excludeSwitches': ['enable-automation'],
    'mobileEmulation': {'deviceName': 'iPhone 6'}
}

@property
def options(self):
    if self.OPTION_MARK:
        chrome_option = self._option()
        chrome_option.add_argument(self.START_MAX)
        for k, v in self.EXP.items():
            chrome_option.add_experimental_option(k, v)
        chrome_option.headless = self.HEADLESS
        return chrome_option
    return None

"chrome的启动以及实例的返回"

@property
def browser(self):
    if self.options:
        chrome = self._browser(self._path, options=self.options)
    else:
        chrome = self._browser(self._path)
    if self.METHOD_MARK:
        chrome.implicitly_wait(self.IMP_TIME)
        chrome.set_script_timeout(self.SCRIPT_TIME_OUT)
        chrome.set_page_load_timeout(self.PAGE_LOAD_TIME)
        chrome.set_window_size(*self.WINDOW_SIZE)

    return chrome

class IE(BROWSER):
CLEAN_SESSION = True

def __init__(self):
    super(IE, self).__init__(browser_type=Ie,
                             options_type=IeOptions,
                             driver_path=super().IE_DRIVER_PATH)

@property
def options(self):
    ie_option = self._option()
    ie_option.ensure_clean_session = self.CLEAN_SESSION
    return ie_option

"chrome的启动以及实例的返回"

@property
def browser(self):
    ie = self._browser(self._path, options=self.options)
    ie.implicitly_wait(self.IMP_TIME)
    ie.set_page_load_timeout(self.PAGE_LOAD_TIME)
    ie.set_script_timeout(self.SCRIPT_TIME_OUT)
    ie.maximize_window()
    return ie

po_demo

from bo_demo import *

class Page:
url = None
driver = None

def element(self, loc: tuple):
    """定位元素的方法
    :param loc:
    :return:
    """
    return self.driver.find_element(*loc)

def elements(self, loc: tuple):
    """定位一组元素或者多个元素
    :param loc:
    :return:
    """
    return self.driver.find_elements(*loc)

class CommonLoginPage(Page):
url = r’http://127.0.0.1/zentao/user-login.html
driver = CHROME.browser
username = (‘id’, ‘account’)
password = (‘name’, ‘password’)
loginBtn = (‘id’, ‘submit’)

def get(self):
    """打开首页地址"""
    self.driver.get(self.url)

def login(self, username: str = 'admin', password: str = 'Lemon0720'):
    self.element(self.username).send_keys(username)
    self.element(self.password).send_keys(password)
    self.element(self.loginBtn).click()

class Search(CommonLoginPage):
searchInput = (‘id’, ‘searchInput’)
searchGo = (‘id’, ‘searchGo’)
user_name = (‘xpath’, ‘//span[@class=“user-name”]’)
bug_label = (‘xpath’, ‘//span[@class=“label label-id”]’)

def search_bug(self, bug_id: str = 1):
    self.element(self.searchInput).send_keys(bug_id)
    self.element(self.searchGo).click()

class TestSearch(Search):
def test_login(self):
self.get()
self.login()
assert self.element(self.user_name).text == ‘admin’

def test_search(self):
    self.search_bug()
    assert self.element(self.bug_label).text == 1

if name == ‘main’:
obj = TestSearch()
obj.test_login()
obj.test_search()

图片描述

请问老师,是哪里有问题,检查了好久

写回答

1回答

慕九州7187113

提问者

2021-08-06

老师,我自己找到问题了。。。
driver = CHROME.browser 应该修改为 driver = CHROME().browser

0
1
托尼老师
我看你的问题看了半天,结果。。。
2021-08-06
共1条回复

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

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

445 学习 · 157 问题

查看课程