提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
一、目录结构及文件说明
二、元素操作类
import sys
from congfig.pub.AttributeEle import *
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.wait import WebDriverWait
import logging.config
import os,datetime
from congfig.pub.FilePath import LOG_PATH_CON
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from tools.YamlTools import OperationElementYaml
from tools.StaticFunction import StaticFunction as SF
from congfig.pub.FrontColour import FrontColour as FC
logging.config.fileConfig(LOG_PATH_CON)
#封装页面元素操作
class OperationPageElement():
def __init__(self,driver):
self.driver = driver
#获取元素操作类型,当前支持,ID、PATH、CLASS_NAME、NAME、CSS_SELECTOR、TAG_NAME
def getByType(self,elType):
#将字符串转换成大写
elemnt_loc = elType.upper()if elemnt_loc == ID:return By.ID
elif elemnt_loc ==XPATH:return By.XPATH
elif elemnt_loc ==CLASS_NAME:return By.CLASS_NAME
elif elemnt_loc == NAME:return By.NAME
elif elemnt_loc ==CSS_SELECTOR:return By.CSS_SELECTOR
elif elemnt_loc == TAG_NAME:return By.TAG_NAME
else:
logging.error(FC.RED%"元素定位类型不存在")
sys.exit()
#等待元素
def waitElement(self,elType,element):
try :
#显示等待元素出现
WebDriverWait(self.driver,5,0.5).until(EC.presence_of_element_located((elType,element)))
logging.info("操作的元素类型:{0},元素值:{1},存在".format(elType,element))return True
except Exception:
logging.error(FC.RED%"时间内元素未出现,测试结束,当前元素:{0}".format(element))
sys.exit()
#操作页面元素param count,默认为None,为1时,则说明有多个值,单个值调用find_element,多个值调用find_elements
def operationElement(self,elType,element,count=0):
elementType = self.getByType(elType)if self.waitElement(elementType,element):if count >=1:
elements_data = self.driver.find_elements(elementType,element)return elements_data
else:
element_data = self.driver.find_element(elementType,element)return element_data
#对页面元素进行点击操作,若存在多个根据下标进行点击
def operationElementClick(self,**kwargs):
#
#ifkwargs['func_attr']=="select":
#
#returnself.__privateOperationSelectEl(type=type,element=element,count=count)
#
#eliffunc_attr =='list':#el= self.operationElement(elType=type, element=element, count=count)#el_list = self.__privateOutputListData(el)
#
#try:#ActionChains(self.driver).move_to_element(el_list[0]).click().perform()#exceptAttributeError:#returnFalseif kwargs['count']>=1:
el = self.operationElement(elType=kwargs['el_types'], element=kwargs['element'], count=kwargs['count'])
el_list = self.__checkElData(el)
try:ActionChains(self.driver).move_to_element(el_list[kwargs['index']-1]).click().perform()#el_list[count-1].click()
except Exception as e :
logging.error(FC.RED%'元素执行点击事件失败,请检查页面元素,元素{0}'.format(kwargs['element']))
sys.exit()else:
el = self.operationElement(elType=kwargs['el_types'], element=kwargs['element'], count=kwargs['count'])
try:ActionChains(self.driver).move_to_element(el).click().perform()#el.click()
except AttributeError:
logging.error(FC.RED%'元素执行点击事件失败,请检查页面元素,元素:{0}'.format(kwargs['element']))
sys.exit()
#对页面文本输入框传值,若存在多个则根据下标进行赋值(加for循环取值
def operationElInputText(self,**kwargs):'''通过count和index组合判断是操作元素
1.index=-1则判断为通过循环count数操作元素
2.index !=-1则根据index 下标操作元素
'''
if kwargs['count']>=1 and kwargs['index']!=-1:
input_el = self.operationElement(elType=kwargs['el_types'], element=kwargs['element'],
count=kwargs['count'])
input_el[kwargs['index']].clear()
SF.sleep_time(1)
input_el[kwargs['index']].send_keys(kwargs['text'])
elif kwargs['count']>=1 and kwargs['index']==-1:
input_el = self.operationElement(elType=kwargs['el_types'], element=kwargs['element'], count=kwargs['count'])for i in range(len(input_el)):
input_el[i].clear()
SF.sleep_time(1)
input_el[i].send_keys(kwargs['text'][i])else:
input_el = self.operationElement(elType=kwargs['el_types'], element=kwargs['element'])
input_el.send_keys(kwargs['text'])
#针对元素列表长度大于一的进行处理,将空元素剔除,返回有文本的元素信息
def __checkElData(self,element):
#接收处理后的元素信息
ifisinstance(element,list):
el_list =list(filter(lambda x: x!='',element))iflen(el_list)==0:return element
else:return el_list
else:
logging.info('返回页面元素文本内容:'.format(element.text))return element.text
#获取页面元素文本内容
#defoperationElementText(self,type,element,count,attribute=None,label=None):
def operationElementText(self,**kwargs):if kwargs['attribute']!= None and kwargs['count']==0:
element_data = self.operationElement(kwargs['type'],kwargs['element'],kwargs['count'])return element_data.getAttribute(kwargs['attribute'])
elif kwargs['label']!= None and kwargs['count']==0:
element_data = self.operationElement(kwargs['type'],kwargs['element'],kwargs['count'])return element_data.text
elif kwargs['label']==None and kwargs['attribute']==None and kwargs['count']==0:
element_data = self.operationElement(kwargs['type'],kwargs['element'],kwargs['count'])
data = element_data.text
list_data = data.split('\n')return list_data
elif kwargs['label']==None and kwargs['attribute']==None and kwargs['count']>=1:
element_data = self.operationElement(kwargs['type'],kwargs['element'],kwargs['count'])
#处理部分元素需要鼠标焦点后才能获取内容
ActionChains(self.driver).move_to_element(element_data[kwargs['index']-1]).click(element_data[kwargs['index']-1]).perform()return element_data[kwargs['index']-1].text
else:
logging.error(FC.RED%"未获取到元素中文本内容")
sys.exit()
#通过select方法获取下拉框选项值
def __privateOperationSelectEl(self,type,element,count):
select_el =Select(self.operationElement(type, element, count))return select_el.select_by_index(count)
#将list的元素中文进行输入打印
def __privateOutputListData(self,element):#data=list(filter(lambda x: x.text !='', element))returnlist(filter(lambda x: x !='' and x.text !='', element))
#封装元素的操作方法通过传入的操作类型调用不同的元素的操作
def autoElement(self,**kwargs):if SF.checkOperationType(kwargs['operation_type']):if kwargs.get('operation_type')== INPUT:return self.operationElInputText(**kwargs)
elif kwargs.get('operation_type')==CLICK:return self.operationElementClick(**kwargs)
elif kwargs.get('operation_type')==VALUE:return self.operationElementText(**kwargs)else:
sys.exit(FC.RED%'当前元素操作类型不支持')
#实例化yaml操作元素方法,执行元素操作
def getYamElData(self,yamlName,funcName,text=None):
el_data =OperationElementYaml(yamlName=yamlName,funcName=funcName)return self.autoElement(el_types=el_data.getElType,operation_type=el_data.getOperationType,
element=el_data.getElement,count=el_data.getCount,
attribute=el_data.getAttribute,label=el_data.getLabel,
index=el_data.getIndex,text=text)
三、页面公共方法
该类主要封装一些鼠标和浏览器操作方法,并且继承OperationPageElement类
class OperationPageFunction(OperationPageElement):
#强制休眠时间
#操作页面多个窗口句柄,获取页面当前总句柄数,通过title将句柄封装成dict,格式{‘title名’:‘句柄信息’}
@property
def __operationWindowHandle(self):
list_all_handle = self.driver.window_handles
return list_all_handle
#根据下标切换页面句柄
def operationSwitchHandle(self,index):
self.driver.switch_to.window(self.__operationWindowHandle[index])return None
# 截图操作
def getImage(self, pagename):
path = os.path.dirname(os.path.dirname(__file__))
current_time = datetime.datetime.now()
time_str = datetime.datetime.strftime(current_time,'%Y-%m-%d_%H-%M-%S')
image_file = path +'//Picture//'+ pagename +'_'+ time_str +'.png'
try:
self.driver.get_screenshot_as_file(image_file)
except BaseException as e:
logging.error(e)
# 操作需要鼠标悬浮显示元素值
def mouseAction(self, el_name):ActionChains(self.driver).move_to_element(el_name).click(el_name).perform()return None
#操作鼠标点击页面按钮
def mouseClick(self,el_name):ActionChains(self.driver).move_to_element(el_name).click(el_name)return None
# 获取系统标题
@property
def getPageTitle(self):return self.driver.title
# 获取系统url
@property
def getPageUrl(self):return self.driver.current_url
# 获取页面所有元素,判断元素是否显示,显示返回True否则返回False
def getPageSource(self, page_source):
page_element = self.driver.page_source
if page_source in page_element:return True
else:return False
总结
新手小白一个方法还存在些问题在持续优化过程中
本文转载自: https://blog.csdn.net/tianheihei__/article/details/125011886
版权归原作者 Monica_ll 所有, 如有侵权,请联系我们删除。
版权归原作者 Monica_ll 所有, 如有侵权,请联系我们删除。