先来看看common有哪些东西
basepage_element.py和basepage_elements.py 封装的是关键字驱动,一个是单一的页面元素,一个是多个页面元素的情况下
config.py 用来判断环境
contants.py 读取目录结构
log.py 封装日志文件
uploding.py 封装页面文件上传
basepage(无关业务):关键字封装。等待、查找元素、点击、输入、获取 文本、获取 属性、窗口切换、iframe切换、上传、select
元素的操作:等待、查找、操作。
实现了:页面当中的每一个操作,都进行了异常捕获、失败截图、操作时间。
现在就来封装一个basepage文件
导入包:根据自己的需求来定
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import datetime
from PO.Common.log import MyLog
from PO.Common.contants import Open
from PO.Common.uploading import upload
然后命名,先把显性等待和页面截图操作,写出来。只有当执行失败的时候,才进行截图操作。
class BasePage:
def __init__(self, driver):
self.driver = driver
'''
loc:定位参数输入
img_doc:截图名字
timeout:显性等待的时长
frequency:显示等待的间隔
path:文件上传的路径
'''
# 等待时间
def wait_eleVisble(self, loc, img_doc="", timeout=30, frequency=0.5):
MyLog ().info ("等待元素可见:{}".format (loc))
try:
# 开始时间
start = datetime.datetime.now ()
WebDriverWait (self.driver, timeout, frequency).until (EC.visibility_of_element_located (loc))
# 结束时间
end = datetime.datetime.now ()
MyLog ().info ("开始等待时间:{},等待结束时间:{},共等待:{}".format (start, end, end - start))
except:
MyLog ().info ("等待时间失效")
# 截图
self.save_web_screenshot (img_doc)
raise
# 网页截图
def save_web_screenshot(self, img_doc):
now = time.strftime ('%Y-%m-%d %H-%M')
filename = ("{}_{}.png".format (img_doc, now))
try:
self.driver.save_screenshot (Open.screenshots () + '/' + filename)
MyLog ().info ("网页截图成功,保存在:{}".format (Open.screenshots () + r'/' + filename))
except:
MyLog ().info ("请检查你定位是否正确")
raise
然后加入查找元素,和点击操作
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import datetime
from PO.Common.log import MyLog
from PO.Common.contants import Open
from PO.Common.uploading import upload
class BasePage:
def __init__(self, driver):
self.driver = driver
'''
loc:定位参数输入
img_doc:截图名字
timeout:显性等待的时长
frequency:显示等待的间隔
path:文件上传的路径
'''
# 等待时间
def wait_eleVisble(self, loc, img_doc="", timeout=30, frequency=0.5):
MyLog ().info ("等待元素可见:{}".format (loc))
try:
# 开始时间
start = datetime.datetime.now ()
WebDriverWait (self.driver, timeout, frequency).until (EC.visibility_of_element_located (loc))
# 结束时间
end = datetime.datetime.now ()
MyLog ().info ("开始等待时间:{},等待结束时间:{},共等待:{}".format (start, end, end - start))
except:
MyLog ().info ("等待时间失效")
# 截图
self.save_web_screenshot (img_doc)
raise
# 查找一个元素
def get_element(self, loc, img_doc=""):
MyLog().info ("定位的元素:{}".format (loc))
try:
return self.driver.find_element (*loc)
except:
MyLog ().warning ("查找元素失败")
# 截图
self.save_web_screenshot (img_doc)
raise
# 点击元素
def click_element(self, loc, img_doc=""):
# 等待元素,查找元素,点击元素
self.wait_eleVisble (loc, img_doc)
ele = self.get_element (loc, img_doc)
MyLog().info ("要点击的元素:{}".format (loc))
try:
ele.click ()
except:
MyLog().warning ("点击元素失败")
self.save_web_screenshot (img_doc)
raise
# 网页截图
def save_web_screenshot(self, img_doc):
now = time.strftime ('%Y-%m-%d %H-%M')
filename = ("{}_{}.png".format (img_doc, now))
try:
self.driver.save_screenshot (Open.screenshots () + '/' + filename)
MyLog ().info ("网页截图成功,保存在:{}".format (Open.screenshots () + r'/' + filename))
except:
MyLog ().info ("请检查你定位是否正确")
raise
可以根据自己的场景需要,进行封装,我现在暂时用到的是获取文本值、输入文本操作,文件上传,点击操作
整体代码:
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import datetime
from PO.Common.log import MyLog
from PO.Common.contants import Open
from PO.Common.uploading import upload
class BasePage:
def __init__(self, driver):
self.driver = driver
'''
loc:定位参数输入
img_doc:截图名字
timeout:显性等待的时长
frequency:显示等待的间隔
path:文件上传的路径
'''
# 等待时间
def wait_eleVisble(self, loc, img_doc="", timeout=30, frequency=0.5):
MyLog ().info ("等待元素可见:{}".format (loc))
try:
# 开始时间
start = datetime.datetime.now ()
WebDriverWait(self.driver,timeout,frequency).until(EC.visibility_of_element_located (loc))
# 结束时间
end = datetime.datetime.now ()
MyLog ().info ("开始等待时间:{},等待结束时间:{},共等待:{}".format (start, end, end - start))
except:
MyLog ().info ("等待时间失效")
# 截图
self.save_web_screenshot (img_doc)
raise
# 查找一个元素
def get_element(self, loc, img_doc=""):
MyLog().info ("定位的元素:{}".format (loc))
try:
return self.driver.find_element (*loc)
except:
MyLog ().warning ("查找元素失败")
# 截图
self.save_web_screenshot (img_doc)
raise
# 点击元素
def click_element(self, loc, img_doc=""):
# 等待元素,查找元素,点击元素
self.wait_eleVisble (loc, img_doc)
ele = self.get_element (loc, img_doc)
MyLog().info ("要点击的元素:{}".format (loc))
try:
ele.click ()
except:
MyLog().warning ("点击元素失败")
self.save_web_screenshot (img_doc)
raise
#输入文本操作
def text_input_element(self,loc,img_doc="",*args):
self.wait_eleVisble (loc, img_doc)
ele = self.get_element (loc, img_doc)
MyLog().info ("文本输入:{}".format (args))
try:
ele.clear()
ele.send_keys(args)
except:
MyLog().warning ("输入文本值失败")
self.save_web_screenshot (img_doc)
raise
#获取文值
def text_element(self,loc,img_doc=""):
self.wait_eleVisble(loc,img_doc)
ele =self.get_element(loc,img_doc)
try:
text = ele.text
MyLog ().info ("元素:{}获取的文本值是:{}".format (loc, text))
return text
except:
MyLog().warning("获取文本值失败")
self.save_web_screenshot(img_doc)
raise
#文件上传
def files_upload_element(self,path,img_doc=""):
try:
time.sleep(3)
upload(path)
time.sleep(2)
except:
MyLog().warning("文件路径错误")
self.save_web_screenshot(img_doc)
raise
# 网页截图
def save_web_screenshot(self, img_doc):
now = time.strftime ('%Y-%m-%d %H-%M')
filename = ("{}_{}.png".format (img_doc, now))
try:
self.driver.save_screenshot (Open.screenshots () + '/' + filename)
MyLog ().info ("网页截图成功,保存在:{}".format (Open.screenshots () + r'/' + filename))
except:
MyLog ().info ("请检查你定位是否正确")
raise
怎么调用?很简单,好处:我们这么一写,别人就不知道我们在干嘛了,只知道这个东西能做点击操作,却没发现我们里面还有等待、点击、查找、日志、截图等操作。
也节约了每次写重复代码,比如要重复写显性等待,重复写find_xxx.click()操作。
from selenium import webdriver
from selenium.webdriver.common.by import By
from PO.Common.basepage_element import BasePage
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
BasePage(driver).click_element((By.XPATH,'//div[@id="u1"]//a[@name="tj_settingicon"]'),'百度点击设置')