直接上代码:
# _*_ coding:utf-8 _*_
from framework.logger import Logger
import time
import os
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.wait import WebDriverWait
logger = Logger(logger='BasePage').getlog()
class BasePage(object):
"""
页面基类,封装了截图方法、定位元素方法、输入框录入、点击操作等方法,供其他页面类通过继承该类调用
"""
def __init__(self, driver):
self.driver = driver
def get_window_img(self):
file_path = os.path.dirname(os.path.dirname(__file__)) + '/screenshots/'
if not os.path.exists(file_path):
os.makedirs(file_path)
rq = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
screenshot_name = file_path + rq + '.png'
try:
self.driver.get_screenshot_as_file(screenshot_name)
logger.info("屏幕截取成功,截图存放路径:%s" % screenshot_name)
except NameError as e:
logger.error("屏幕截取失败:%s" % e)
def find_element(self, selector):
"""
:param selector, 参数selector格式示例:id=>login_name,其中id为定位方式,=>是分隔符,
login_name定位的值
"""
element = ''
if "=>" not in selector:
try:
element = self.driver.find_element_by_id(selector)
logger.info("成功定位到元素%s通过%s,value:%s" % (element.text))
except NoSuchElementException as e:
logger.error("NoSuchElementException: %s" % e)
self.get_window_img()
selector_by = selector.split("=>")[0]
selector_value = selector.split("=>")[1]
if selector_by == 'i' or selector_by == 'id':
try:
element = self.driver.find_element_by_id(selector_value)
logger.info("Had find the element \'%s\' successful,"
" by %s via value: %s" % (element.text, selector_by, selector_value))
except NoSuchElementException as e:
logger.error("NoSuchElementException: %s" % e)
self.get_window_img()
elif selector_by == 'n' or selector_by == 'name':
try:
element = self.driver.find_element_by_name(selector_value)
logger.info("Had find the element \'%s\' successful,"
" by %s via value: %s" % (element.text, selector_by, selector_value))
except NoSuchElementException as e:
logger.error("NoSuchElementException: %s" % e)
self.get_window_img()
elif selector_by == 'l' or selector_by == 'link_text':
try:
element = self.driver.find_element_by_link_text(selector_value)
logger.info("Had find the element \'%s\' successful,"
" by %s via value: %s" % (element.text, selector_by, selector_value))
except NoSuchElementException as e:
logger.error("NoSuchElementException: %s" % e)
self.get_window_img()
elif selector_by == 'p' or selector_by == 'partial_link_text':
try:
element = self.driver.find_element_by_partial_link_text(selector_value)
logger.info("Had find the element \'%s\' successful,"
" by %s via value: %s" % (element.text, selector_by, selector_value))
except NoSuchElementException as e:
logger.error("NoSuchElementException: %s" % e)
self.get_window_img()
elif selector_by == 't' or selector_by == 'tag_name':
try:
element = self.driver.find_element_by_tag_name(selector_value)
logger.info("Had find the element \'%s\' successful,"
" by %s via value: %s" % (element.text, selector_by, selector_value))
except NoSuchElementException as e:
logger.error("NoSuchElementException: %s" % e)
self.get_window_img()
elif selector_by == 'c' or selector_by == 'class_name':
try:
element = self.driver.find_element_by_class_name(selector_value)
logger.info("Had find the element \'%s\' successful,"
" by %s via value: %s" % (element.text, selector_by, selector_value))
except NoSuchElementException as e:
logger.error("NoSuchElementException: %s" % e)
self.get_window_img()
elif selector_by == 's' or selector_by == 'css_selector':
try:
element = self.driver.find_element_by_css_selector(selector_value)
logger.info("Had find the element \'%s\' successful,"
" by %s via value: %s" % (element.text, selector_by, selector_value))
except NoSuchElementException as e:
logger.error("NoSuchElementException: %s" % e)
self.get_window_img()
elif selector_by == 'x' or selector_by == 'xpath':
try:
element = self.driver.find_element_by_xpath(selector_value)
if element.get_attribute('placeholder') is not None:
logger.info("Had find the element \'%s\' successful,"
" by %s via value: %s" % (element.get_attribute('placeholder'), selector_by, selector_value))
else:
logger.info("Had find the element \'%s\' successful,"
" by %s via value: %s" % (element.text, selector_by, selector_value))
except NoSuchElementException as e:
logger.error("NoSuchElementException: %s" % e)
self.get_window_img()
else:
raise NameError("请输入有效的目标元素类型")
return element
def input(self, selector, text):
element = self.find_element(selector)
element.clear()
try:
element.send_keys(text)
logger.info("已经在输入框中输入\'%s\'" % text)
except NameError as e:
logger.error("在输入框中输入失败:%s" % e)
self.get_window_img()
def clear(self, selector):
element = self.find_element(selector)
try:
element.clear()
logger.info("成功清空目标元素'%s'数据" % element.text)
except NameError as e:
logger.error("目标元素'%s'数据清除失败,错误信息:%s" % (element.text, e))
self.get_window_img()
def click(self, selector):
element = self.find_element(selector)
try:
logger.info("点击元素'%s'" % element.text)
element.click()
except NameError as e:
logger.error("点击元素'%s'失败,失败原因:%s" % (element.text, e))
self.get_window_img()
def refresh(self): # 刷新整个页面
self.refresh()
def select_by_value(self, selector, text):
element = self.find_element(selector)
try:
logger.info("选择下拉框'%s'的值:%s" % (element.get_attribute('placeholder'), text))
Select(element).select_by_value(text)
except NameError as e:
logger.error("无法选择下拉框'%s'的值:%s" % (element.text, text))
self.get_window_img()
def select_by_visible_text(self, selector, text): # 选择下拉框的值
element = self.find_element(selector)
try:
logger.info("选择下拉框'%s'的值:%s" % (element.get_attribute('placeholder'), text))
self.wait(1)
Select(element).select_by_visible_text(text)
except NameError as e:
logger.error("无法选择下拉框'%s'的值:%s" % (element.text, text))
self.get_window_img()
def switch_newpage(self):
win_handles = self.driver.window_handles
if len(win_handles) > 1:
try:
self.driver.switch_to.window(win_handles[1])
logger.info("成功切换到新窗口:%s" % self.driver.title)
except NameError as e:
logger.error("无法切换到新窗口")
self.get_window_img()
else:
raise NameError("当前浏览器没有生成新的窗口")
def get_page_title(self):
logger.info("当前网页标题是%s" % self.driver.title)
return self.driver.title
def get_text(self, selector): # 获取元素文本
element = self.find_element(selector)
try:
logger.info("获取元素的text内容为:%s" % element.text)
return element.text
except NameError as e:
logger.error("获取元素的text内容失败:%s" % e)
self.get_window_img()
def quit_browser(self):
self.driver.quit()
logger.info("关闭所有窗口,退出浏览器驱动")
def close(self):
try:
self.driver.close()
logger.info("关闭当前窗口,不退出浏览器驱动")
except NameError as e:
logger.error("当前窗口关闭失败,错误信息:%s" % e)
def until_wait(self, selector, seconds): # 显示等待
try:
wait_ = WebDriverWait(self.driver, seconds)
wait_.until(lambda driver: self.find_element(selector))
logger.info("等待 %d 秒." % seconds)
except NameError as e:
logger.error("元素加载失败,失败原因:%s" % e)
def wait(self, seconds): # 隐式等待
self.driver.implicitly_wait(seconds)
logger.info("程序进入隐式等待状态,等待 %d 秒" % seconds)
@staticmethod
def sleep(seconds): # 强制等待
time.sleep(seconds)
logger.info("等待 %d 秒" % seconds)