老师帮忙看下,打开的窗口很小,输入bug的搜索1之后没有点击go图标

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

南极2018

2022-03-19

我打开的页面是很小的一小块,所以bug序号元素找不到,运行时这样卡住了不动,过一会儿之后报错。

图片描述

代码如下:
bo demo

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 = '../drivers/chrome_driver.exe'
    EDGE_DRIVER_PATH = '../drivers/edge_driver.exe'
    FIREFOX_DRIVER_PATH = '../drivers/gecko_driver.exe'
    IE_DRIVER_PATH = '../drivers/IEDriverServer.exe'
    OPERA_DRIVER_PATH = '../drivers/opera_driver.exe'


    WINDOWS_SIZE = (1024,768)

    IMP_WAIT = 30

    PAGE_LOAD_TIME = 20

    SCRIPT_TIME_OUT = 20

    HEADLESS = True

    def __init__(self,browser_type:Type[Union[Firefox,Chrome,Edge,Opera,Ie]]=Chrome,
                 option_type:Type[Union[FirefoxOptions,ChromeOptions,IeOptions]]=ChromeOptions,
                 driver_path:str=CHROME_DRIVER_PATH):
        if not issubclass(browser_type,(Firefox,Chrome,Edge,Opera,Ie)):
            raise BrowserTypeError(browser_type)
        if not issubclass(option_type,(FirefoxOptions,ChromeOptions,IeOptions)):
            raise BrowserTypeError(option_type)
        if not isinstance(driver_path,str):
            raise TypeError
        self._path=driver_path
        self._browser=browser_type
        self._option=option_type

    @property
    def options(self):
        #子类中实现
        return

    @property
    def browser(self):
        #子类中实现
        return

class CHROME(BROWSER):
    OPTION_MARK =True

    METHOD_MARK = True

    HEADLESS = False

    IMP_WAIT = 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):
        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

    @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 = self._browser(self._path, options=self.options)
            chrome.implicitly_wait(self.IMP_WAIT)
            chrome.set_script_timeout(self.SCRIPT_TIME_OUT)
            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('http://127.0.0.1/zentao/user-login.html')
#     from time import sleep
#     sleep(5)

class IE(BROWSER):
    CLEAN_SESSION = True

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

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

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

# with IE().browser as _ie:
#     _ie.get('http://127.0.0.1/zentao/user-login.html')
#     from time import sleep
#     sleep(5)





podemo

from chapter3.bo_demo import *

class Page:

    url =None
    driver= None

    def element(self,loc:tuple):

        return  self.driver.find_element(*loc)

    def elements(self,loc:tuple):

        return self.driver.find_elements(*loc)

class CommonLoginPage(Page):

    url = '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='Qqwer1234'):
        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'
        print('logintest is ok')

    def test_search(self):
        self.search_bug()
        print(self.element(self.bug_label).text())
        assert self.element(self.bug_label).text() == '1'
        print('searchtest is ok')

obj= TestSearch()
obj.test_login()
obj.test_search()

报错

D:\2022TEST\bopo\venv\Scripts\python.exe D:/2022TEST/bopo/chapter3/po_demo.py
logintest is ok
Traceback (most recent call last):
File “D:\2022TEST\bopo\chapter3\po_demo.py”, line 58, in
obj.test_search()
File “D:\2022TEST\bopo\chapter3\po_demo.py”, line 52, in test_search
print(self.element(self.bug_label).text())
File “D:\2022TEST\bopo\chapter3\po_demo.py”, line 10, in element
return self.driver.find_element(*loc)
File “D:\2022TEST\bopo\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py”, line 976, in find_element
return self.execute(Command.FIND_ELEMENT, {
File “D:\2022TEST\bopo\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py”, line 321, in execute
self.error_handler.check_response(response)
File “D:\2022TEST\bopo\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py”, line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {“method”:“xpath”,“selector”:"//span[@class=“label label-id”]"}
(Session info: chrome=99.0.4844.74)

Process finished with exit code 1

写回答

1回答

托尼老师

2022-03-24

1、浏览器界面大小问题:

没有最大化是由于在获取chrome实例后,重新设置了windows size;

目标网页没有展开是由于设置了模拟移动设备的实验参数

EXP ={        'excludeSwitches': ['enable-automation'],        'mobileEmulation': {'deviceName':'iPhone 6'}    }


2、报错问题:

从报错日志来看

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {“method”:“xpath”,“selector”:"//span[@class=“label label-id”]"}

有两种可能:

第一、定位策略的xpath路径不对,这个可以在网页源码里检查一下;

第二,极有可能是上面的浏览器界面问题导致页面出现横向滚动条,元素被遮挡,在浏览器窗口的UI层上用户不可见,但实际上元素已经成功渲染到页面上,这种情况也是属于所谓的元素有效但不可见,也是会抛出异常的。如果是这个问题导致的,直接最大化浏览器,禁用移动模式,再次执行检查一下。

0
0

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

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

445 学习 · 157 问题

查看课程