0


selenium+pytest:Web自动化框架设计及元素操作封装(一)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

一、目录结构及文件说明

在这里插入图片描述

二、元素操作类

  1. import sys
  2. from congfig.pub.AttributeEle import *
  3. from selenium.webdriver.support import expected_conditions as EC
  4. from selenium.webdriver.support.select import Select
  5. from selenium.webdriver.support.wait import WebDriverWait
  6. import logging.config
  7. import os,datetime
  8. from congfig.pub.FilePath import LOG_PATH_CON
  9. from selenium.webdriver import ActionChains
  10. from selenium.webdriver.common.by import By
  11. from tools.YamlTools import OperationElementYaml
  12. from tools.StaticFunction import StaticFunction as SF
  13. from congfig.pub.FrontColour import FrontColour as FC
  14. logging.config.fileConfig(LOG_PATH_CON)
  15. #封装页面元素操作
  16. class OperationPageElement():
  17. def __init__(self,driver):
  18. self.driver = driver
  19. #获取元素操作类型,当前支持,ID、PATH、CLASS_NAME、NAME、CSS_SELECTOR、TAG_NAME
  20. def getByType(self,elType):
  21. #将字符串转换成大写
  22. elemnt_loc = elType.upper()if elemnt_loc == ID:return By.ID
  23. elif elemnt_loc ==XPATH:return By.XPATH
  24. elif elemnt_loc ==CLASS_NAME:return By.CLASS_NAME
  25. elif elemnt_loc == NAME:return By.NAME
  26. elif elemnt_loc ==CSS_SELECTOR:return By.CSS_SELECTOR
  27. elif elemnt_loc == TAG_NAME:return By.TAG_NAME
  28. else:
  29. logging.error(FC.RED%"元素定位类型不存在")
  30. sys.exit()
  31. #等待元素
  32. def waitElement(self,elType,element):
  33. try :
  34. #显示等待元素出现
  35. WebDriverWait(self.driver,5,0.5).until(EC.presence_of_element_located((elType,element)))
  36. logging.info("操作的元素类型:{0},元素值:{1},存在".format(elType,element))return True
  37. except Exception:
  38. logging.error(FC.RED%"时间内元素未出现,测试结束,当前元素:{0}".format(element))
  39. sys.exit()
  40. #操作页面元素param count,默认为None,为1时,则说明有多个值,单个值调用find_element,多个值调用find_elements
  41. def operationElement(self,elType,element,count=0):
  42. elementType = self.getByType(elType)if self.waitElement(elementType,element):if count >=1:
  43. elements_data = self.driver.find_elements(elementType,element)return elements_data
  44. else:
  45. element_data = self.driver.find_element(elementType,element)return element_data
  46. #对页面元素进行点击操作,若存在多个根据下标进行点击
  47. def operationElementClick(self,**kwargs):
  48. #
  49. #ifkwargs['func_attr']=="select":
  50. #
  51. #returnself.__privateOperationSelectEl(type=type,element=element,count=count)
  52. #
  53. #eliffunc_attr =='list':#el= self.operationElement(elType=type, element=element, count=count)#el_list = self.__privateOutputListData(el)
  54. #
  55. #try:#ActionChains(self.driver).move_to_element(el_list[0]).click().perform()#exceptAttributeError:#returnFalseif kwargs['count']>=1:
  56. el = self.operationElement(elType=kwargs['el_types'], element=kwargs['element'], count=kwargs['count'])
  57. el_list = self.__checkElData(el)
  58. try:ActionChains(self.driver).move_to_element(el_list[kwargs['index']-1]).click().perform()#el_list[count-1].click()
  59. except Exception as e :
  60. logging.error(FC.RED%'元素执行点击事件失败,请检查页面元素,元素{0}'.format(kwargs['element']))
  61. sys.exit()else:
  62. el = self.operationElement(elType=kwargs['el_types'], element=kwargs['element'], count=kwargs['count'])
  63. try:ActionChains(self.driver).move_to_element(el).click().perform()#el.click()
  64. except AttributeError:
  65. logging.error(FC.RED%'元素执行点击事件失败,请检查页面元素,元素:{0}'.format(kwargs['element']))
  66. sys.exit()
  67. #对页面文本输入框传值,若存在多个则根据下标进行赋值(加for循环取值
  68. def operationElInputText(self,**kwargs):'''通过count和index组合判断是操作元素
  69. 1.index=-1则判断为通过循环count数操作元素
  70. 2.index !=-1则根据index 下标操作元素
  71. '''
  72. if kwargs['count']>=1 and kwargs['index']!=-1:
  73. input_el = self.operationElement(elType=kwargs['el_types'], element=kwargs['element'],
  74. count=kwargs['count'])
  75. input_el[kwargs['index']].clear()
  76. SF.sleep_time(1)
  77. input_el[kwargs['index']].send_keys(kwargs['text'])
  78. elif kwargs['count']>=1 and kwargs['index']==-1:
  79. input_el = self.operationElement(elType=kwargs['el_types'], element=kwargs['element'], count=kwargs['count'])for i in range(len(input_el)):
  80. input_el[i].clear()
  81. SF.sleep_time(1)
  82. input_el[i].send_keys(kwargs['text'][i])else:
  83. input_el = self.operationElement(elType=kwargs['el_types'], element=kwargs['element'])
  84. input_el.send_keys(kwargs['text'])
  85. #针对元素列表长度大于一的进行处理,将空元素剔除,返回有文本的元素信息
  86. def __checkElData(self,element):
  87. #接收处理后的元素信息
  88. ifisinstance(element,list):
  89. el_list =list(filter(lambda x: x!='',element))iflen(el_list)==0:return element
  90. else:return el_list
  91. else:
  92. logging.info('返回页面元素文本内容:'.format(element.text))return element.text
  93. #获取页面元素文本内容
  94. #defoperationElementText(self,type,element,count,attribute=None,label=None):
  95. def operationElementText(self,**kwargs):if kwargs['attribute']!= None and kwargs['count']==0:
  96. element_data = self.operationElement(kwargs['type'],kwargs['element'],kwargs['count'])return element_data.getAttribute(kwargs['attribute'])
  97. elif kwargs['label']!= None and kwargs['count']==0:
  98. element_data = self.operationElement(kwargs['type'],kwargs['element'],kwargs['count'])return element_data.text
  99. elif kwargs['label']==None and kwargs['attribute']==None and kwargs['count']==0:
  100. element_data = self.operationElement(kwargs['type'],kwargs['element'],kwargs['count'])
  101. data = element_data.text
  102. list_data = data.split('\n')return list_data
  103. elif kwargs['label']==None and kwargs['attribute']==None and kwargs['count']>=1:
  104. element_data = self.operationElement(kwargs['type'],kwargs['element'],kwargs['count'])
  105. #处理部分元素需要鼠标焦点后才能获取内容
  106. 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
  107. else:
  108. logging.error(FC.RED%"未获取到元素中文本内容")
  109. sys.exit()
  110. #通过select方法获取下拉框选项值
  111. def __privateOperationSelectEl(self,type,element,count):
  112. select_el =Select(self.operationElement(type, element, count))return select_el.select_by_index(count)
  113. #将list的元素中文进行输入打印
  114. def __privateOutputListData(self,element):#data=list(filter(lambda x: x.text !='', element))returnlist(filter(lambda x: x !='' and x.text !='', element))
  115. #封装元素的操作方法通过传入的操作类型调用不同的元素的操作
  116. def autoElement(self,**kwargs):if SF.checkOperationType(kwargs['operation_type']):if kwargs.get('operation_type')== INPUT:return self.operationElInputText(**kwargs)
  117. elif kwargs.get('operation_type')==CLICK:return self.operationElementClick(**kwargs)
  118. elif kwargs.get('operation_type')==VALUE:return self.operationElementText(**kwargs)else:
  119. sys.exit(FC.RED%'当前元素操作类型不支持')
  120. #实例化yaml操作元素方法,执行元素操作
  121. def getYamElData(self,yamlName,funcName,text=None):
  122. el_data =OperationElementYaml(yamlName=yamlName,funcName=funcName)return self.autoElement(el_types=el_data.getElType,operation_type=el_data.getOperationType,
  123. element=el_data.getElement,count=el_data.getCount,
  124. attribute=el_data.getAttribute,label=el_data.getLabel,
  125. index=el_data.getIndex,text=text)

三、页面公共方法

该类主要封装一些鼠标和浏览器操作方法,并且继承OperationPageElement类

  1. class OperationPageFunction(OperationPageElement):
  2. #强制休眠时间
  3. #操作页面多个窗口句柄,获取页面当前总句柄数,通过title将句柄封装成dict,格式{‘title名’:‘句柄信息’}
  4. @property
  5. def __operationWindowHandle(self):
  6. list_all_handle = self.driver.window_handles
  7. return list_all_handle
  8. #根据下标切换页面句柄
  9. def operationSwitchHandle(self,index):
  10. self.driver.switch_to.window(self.__operationWindowHandle[index])return None
  11. # 截图操作
  12. def getImage(self, pagename):
  13. path = os.path.dirname(os.path.dirname(__file__))
  14. current_time = datetime.datetime.now()
  15. time_str = datetime.datetime.strftime(current_time,'%Y-%m-%d_%H-%M-%S')
  16. image_file = path +'//Picture//'+ pagename +'_'+ time_str +'.png'
  17. try:
  18. self.driver.get_screenshot_as_file(image_file)
  19. except BaseException as e:
  20. logging.error(e)
  21. # 操作需要鼠标悬浮显示元素值
  22. def mouseAction(self, el_name):ActionChains(self.driver).move_to_element(el_name).click(el_name).perform()return None
  23. #操作鼠标点击页面按钮
  24. def mouseClick(self,el_name):ActionChains(self.driver).move_to_element(el_name).click(el_name)return None
  25. # 获取系统标题
  26. @property
  27. def getPageTitle(self):return self.driver.title
  28. # 获取系统url
  29. @property
  30. def getPageUrl(self):return self.driver.current_url
  31. # 获取页面所有元素,判断元素是否显示,显示返回True否则返回False
  32. def getPageSource(self, page_source):
  33. page_element = self.driver.page_source
  34. if page_source in page_element:return True
  35. else:return False

总结

新手小白一个方法还存在些问题在持续优化过程中


本文转载自: https://blog.csdn.net/tianheihei__/article/details/125011886
版权归原作者 Monica_ll 所有, 如有侵权,请联系我们删除。

“selenium+pytest:Web自动化框架设计及元素操作封装(一)”的评论:

还没有评论