即对selenium webdriver API基本操作的二次封装
目的:简化代码,提供框架该有的东西
每一个函数 -提供了一个功能 - 公共的功能
有了basepage,在PageObjects当中直接调用元素操作,不用考虑等待/查找。
…
无pagebase,PageObjects当中,重复调用了等待/查找/操作
日志/失败 截图 – 进行处理
1.等待可见
2.查找元素
3.点击 - 前提:等待和查找
4.输入 - 前提:等待和查找
5.获取属性 - 前提:等待和查找
6.获取文本 - 前提:等待和查找
from selenium.webdriver.remote.webdriver import WebDriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from Conmon.logger_handler import logger
from Conmon.dir_config import screenshot_path
import time
# 记录日志/失败截图+错误信息输出+抛出异常
class BasePage:
# BasePage类,针对PageObjects类的二次封装
def __init__(self, driver: WebDriver):
self.driver = driver
# 1.等待元素可见
def wait_ele_visible(self, loc, img_name, timeout=20, poll_fre=0.5):
"""
:param loc: 元素定位
:param img_name: {页面名称_页面行为}
:param timeout: 最长超时时间,默认以秒为单位
:param poll_fre: 检测的间隔步长,默认为0.5s
:return:
查找元素用了多久?
等待开始的时候,记录一下当前的时间,等等待结束后,再记录一次,然后计算时间差
"""
logger.info("在{} 等待 {} 元素可见。".format(img_name, loc))
# 等待开始的时候,记录一下当前的时间
start_time = time.time()
try:
WebDriverWait(self.driver, timeout, poll_frequency=poll_fre).until(EC.visibility_of_element_located(loc))
except:
# 失败截图写入日志
self.save_page_shot(img_name)
logger.exception("等待元素可见失效!") # 异常信息写入日志当中
raise
else:
# 等待结束后,再记录一次,然后计算时间差
end_time = time.time()
dif_time = int(end_time) - int(start_time)
logger.info("在{} 等待 {} 元素时间 {}".format(img_name, loc, dif_time))
# 2.查找元素
def get_element(self, loc, img_name):
logger.info("在{} 查找元素 {}。".format(img_name, loc))
try:
ele = self.driver.find_element(*loc)
except:
self.save_page_shot(img_name)
logger.exception("查找元素失败!") # 异常信息写入日志当中
raise
else: # 查找成功返回ele对象
return ele
# 查找所有的元素
def get_elements(self, loc, img_name):
logger.info("在{} 查找所有元素 {}。".format(img_name, loc))
try:
eles = self.driver.find_elements(*loc)
except:
self.save_page_shot(img_name)
logger.exception("查找所有元素失败!") # 异常信息写入日志当中
raise
else: # 查找成功返回ele对象
return eles
# 3.点击 # 需要元素可见
def click_element(self, loc, img_name, timeout=20, poll_fre=0.5):
self.wait_ele_visible(loc, img_name, timeout, poll_fre)
ele = self.get_element(loc, img_name)
logger.info("在 {} 点击 {} 元素。".format(img_name, loc))
try:
ele.click()
except:
self.save_page_shot(img_name)
logger.exception("点击元素失败!") # 异常信息写入日志当中
raise
# 4.文本输入
def input_text(self, loc, value, img_name, timeout=20, poll_fre=0.5):
self.wait_ele_visible(loc, img_name, timeout, poll_fre)
ele = self.get_element(loc, img_name)
logger.info("在 {} 往 {} 元素中输入文本值 {}。".format(img_name, loc, value))
try:
ele.send_keys(value)
except:
self.save_page_shot(img_name)
logger.exception("文本输入元素失败!") # 异常信息写入日志当中
raise
# 5.获取属性 - 不一定要可见 - 没有绝对的答案
def get_ele_attribute(self, loc, attr_name, img_name, timeout=20, poll_fre=0.5):
self.wait_ele_visible(loc, img_name, timeout, poll_fre)
ele = self.get_element(loc, img_name)
logger.info("在 {} 获取 {} 元素的 {} 属性。".format(img_name, loc, attr_name))
try:
value = ele.get_attribute(attr_name)
except:
self.save_page_shot(img_name)
logger.exception("获取元素属性值失败!") # 异常信息写入日志当中
raise
else:
logger.info("属性值为:{}".format(value))
return value
# 6.元素存在
# def wait_page_element_exist(self):
# pass
# 7.获取元素文本值
def get_ele_text(self, loc, img_name, timeout=20, poll_fre=0.5):
self.wait_ele_visible(loc, img_name, timeout, poll_fre)
ele = self.get_element(loc, img_name)
logger.info("在 {} 获取 {} 元素的文本值。".format(img_name, loc))
try:
text = ele.text
except:
self.save_page_shot(img_name)
logger.exception("获取元素属性值失败!") # 异常信息写入日志当中
raise
else:
logger.info("文本值为:{}".format(text))
return text
# 保存截图
def save_page_shot(self, img_name):
"""
:param img_name:{页面名称_页面行为}
:return:
"""
# 图片存储到Outpus的screenshots 下,唯一不同的是,图片命名
# 命名规范:{页面名称_页面行为}_时间.png
# 文件完整名称 = Outputs的screenshot + {页面名称_页面行为}_时间.png
now_time = time.strftime("%Y-%m-%d %H-%M-%S")
# file_name = "{}_{}.png".format(img_name, now_time)
screenshots_path = screenshot_path + "/{}_{}.png".format(img_name, now_time)
self.driver.save_screenshot(screenshots_path)
logger.info("截取当前页面成功并存储在:{}".format(screenshots_path))
if __name__ == '__main__':
# import time
# now = time.strftime("%Y-%m-%d %H:%M:%S")
# print(now)
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 调basepage类里面的页面操作行为,实例化
bp = BasePage(driver)
search_loc = ("id", "kw")
bp.input_text(search_loc, "basepage二次封装", "百度页面_搜索输入操作")
问题1:
保存截图需要注意的是:文件名字不能有冒号