在完成了日志類封裝之后,那我們就要對測試基類進行實現,在其中對一些請求再次封裝,在項目下新建一個framework文件夾,在文件夾下新建Base_Page.py文件,這是用來寫測試基類的文件。在項目下新建screenshots文件件,用來存放截圖。項目結構如下。
具體怎么封裝還是要看被測試需要什么,只能提供一個大致思路,我項目能用的封裝,你項目並不一定能用
測試基類的思路就是把所有能公用的方法全部封裝,並加上日志輸出。報錯截圖等。
看下Base_Page.py下具體代碼
from Logs.log import log1
from selenium.common.exceptions import NoSuchElementException
import getcwd
import os
import time
class BasePage:
"""測試基類"""
def __init__(self, driver):
self.driver = driver
@staticmethod
def isdisplayed(element):
"""元素是否存在"""
value = element.is_displayed()
return value
@staticmethod
def my_sleep(secondes):
"""強制等待"""
time.sleep(secondes)
log1.info('暫停%d秒' % secondes)
def get_img(self):
"""截圖"""
path = os.path.join(getcwd.get_cwd(), 'screenshots/') # 拼接截圖保存路徑
rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time())) # 按格式獲取當前時間
screen_name = path + rq + '.png' # 拼接截圖文件名
# noinspection PyBroadException
try:
self.driver.get_screenshot_as_file(screen_name)
log1.info("截圖保存成功")
except BaseException:
log1.error("截圖失敗", exc_info=1)
def find_element(self, selector):
"""定位元素"""
by = selector[0]
value = selector[1]
element = None
if by in ['id', 'name', 'class', 'tag', 'link', 'plink', 'css', 'xpath']:
# noinspection PyBroadException
try:
if by == 'id':
element = self.driver.find_element_by_id(value)
elif by == 'name':
element = self.driver.find_element_by_name(value)
elif by == 'class':
element = self.driver.find_element_by_class_name(value)
elif by == 'tag':
element = self.driver.find_element_by_tag_name(value)
elif by == 'link':
element = self.driver.find_element_by_link_text(value)
elif by == 'plink':
element = self.driver.find_element_by_partial_link_text(value)
elif by == 'css':
element = self.driver.find_element_by_css_selector(value)
elif by == 'xpath':
element = self.driver.find_element_by_xpath(value)
else:
log1.error('沒有找到元素')
log1.info('元素定位成功。定位方式:%s,使用的值%s:' % (by, value))
return element
except NoSuchElementException:
log1.error("報錯信息:", exc_info=1)
self.get_img() # 調用截圖
else:
log1.error('輸入的元素定位方式錯誤')
def type(self, selector, value):
"""輸入內容"""
element = self.find_element(selector)
element.clear()
log1.info('清空輸入內容')
# noinspection PyBroadException
try:
element.send_keys(value)
log1.info('輸入的內容:%s' % value)
except BaseException:
log1.error('內容輸入報錯', exc_info=1)
self.get_img()
def click(self, selector):
"""點擊元素"""
element = self.find_element(selector)
# noinspection PyBroadException
try:
element.click()
log1.info('點擊元素成功')
except BaseException:
display = self.isdisplayed(element)
if display is True:
self.my_sleep(3)
element.click()
log1.info('點擊元素成功')
else:
self.get_img()
log1.error('點擊元素報錯', exc_info=1)
def use_js(self, js):
"""調用js"""
# noinspection PyBroadException
try:
self.driver.execute_script(js)
log1.info('js執行成功,js內容為:%s' % js)
except BaseException:
log1.error('js執行報錯', exc_info=1)
def switch_menue(self, parentelement, secelement, targetelement):
"""三級菜單切換"""
self.my_sleep(3)
# noinspection PyBroadException
try:
self.driver.switch_to_default_content()
self.click(parentelement)
log1.info('成功點擊一級菜單:%s' % parentelement)
self.click(secelement)
log1.info('成功點擊二級菜單:%s' % secelement)
self.click(targetelement)
log1.info('成功點擊三級菜單:%s' % targetelement)
except BaseException:
log1.error('切換菜單報錯', exc_info=1)
def switch_ifarme(self, selector):
"""切換farm"""
element = self.find_element(selector)
# noinspection PyBroadException
try:
self.driver.switch_to.frame(element)
log1.info('切換frame成功')
except BaseException:
log1.error('切換frame報錯', exc_info=1)
def get_title(self):
"""獲取title"""
title = self.driver.title
log1.info('當前窗口的title是:%s' % title)
return title
def my_quit(self):
"""關閉瀏覽器"""
self.driver.quit()
log1.info('關閉瀏覽器')
接下來測試一下封裝的代碼
在test_base.py寫如下代碼並運行