老师帮忙看下,打开的窗口很小,输入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层上用户不可见,但实际上元素已经成功渲染到页面上,这种情况也是属于所谓的元素有效但不可见,也是会抛出异常的。如果是这个问题导致的,直接最大化浏览器,禁用移动模式,再次执行检查一下。
00
相似问题