想设计出 ios+web+android 一体的框架
我目前设计框架是 POM(project object model) 设计模式
然后阐述一下自己的设计思路
在 Page 木内一个 py 文件封装一个功能或者一个页面的操作元素 一些单独的操作元素,封装成方法,然后每个页面 page 内都会有个核心流程方法
然后说一下我为什么要封装成方法而不是变成类变量,因为我感觉封装好后,直接调用比较方便,然后也能保证元素唯一性 (有些元素可能是好几个页面的按钮)
维护元素时能很清楚。
我的框架目录
common:
封装元素,循环检测元素是否存在,定位不到抛出指定异常,并记录在 Allure 测试报告内
page 的封装
封装保证元素路径的唯一性, 进行设计测试用例时,可以灵活调用每个页面的每个元素。
testcases:
一个 py 对应一个业务流程
更新:重新修改元素操作方法
点击输入等操作内 融合 find_elements 和 find_elements 用元组传入
def find_elements(self, locate, img_doc, timeout=10, frequency=0.5):
"""
检测定位元素是否存在 多个元素
:param locate: 元素定位方式+路径
:param img_doc: 截图说明
:param timeout: 等待的超时时间
:param frequency: 轮询频率
:return: WebElement元素地址 返回list类型
"""
try:
el = None
wait = WebDriverWait(self.driver, timeout, frequency)
if locate[0] == 'id':
el = wait.until(lambda diver: self.driver.find_elements(By.ID, locate[1]), message='没找到该元素')
elif locate[0] == 'xpath':
el = wait.until(lambda diver: self.driver.find_elements(By.XPATH, locate[1]), message='没找到该元素')
elif locate[0] == 'name':
el = wait.until(lambda diver: self.driver.find_elements(By.NAME, locate[1]), message='没找到该元素')
elif locate[0] == 'css_selector':
el = wait.until(lambda diver: self.driver.find_elements(By.CSS_SELECTOR, locate[1]),
message='没找到该元素')
elif locate[0] == 'tag_name':
el = wait.until(lambda diver: self.driver.find_elements(By.TAG_NAME, locate[1]), message='没找到该元素')
elif locate[0] == 'partial_link_text':
el = wait.until(lambda diver: self.driver.find_elements(By.PARTIAL_LINK_TEXT, locate[1]),
message='没找到该元素')
elif locate[0] == 'link_text':
el = wait.until(lambda diver: self.driver.find_elements(By.LINK_TEXT, locate[1]), message='没找到该元素')
elif locate[0] == 'class_name':
el = wait.until(lambda diver: self.driver.find_elements(By.CLASS_NAME, locate[1]), message='没找到该元素')
elif locate[0] == 'predicate':
el = wait.until(lambda diver: self.driver.find_elements_by_ios_predicate(locate[1]), message='没找到该元素')
elif locate[0] == 'accessibility_id':
el = wait.until(lambda diver: self.driver.find_elements_by_accessibility_id(locate[1]), message='没找到该元素')
if el is not None:
return el
self.logger.info("<{}>,元素<{}>定位成功".format(img_doc, locate[1]))
except Exception as e:
self.logger.error("<{}>元素<{}>定位失败!".format(img_doc, locate[1], ))
raise e
def click(self, locate, img_doc):
"""
点击按钮
:param locate: 元素定位方式+路径 元组类型传入
:param img_doc: 截图说明
"""
try:
if len(locate) == 2:
el = self.find_element(locate, img_doc)
el.click()
self.logger.info("点击<{}>成功,元素和定位方式:{}".format(img_doc, locate))
else:
el = self.find_elements(locate, img_doc)
el[locate[2]].click()
self.logger.info("点击<{}>成功,元素和定位方式:{}".format(img_doc, locate))
except Exception as e:
self.logger.error("点击<{}>失败,元素和定位方式:{}".format(img_doc, locate))
self.add_allure_attach(img_doc)
raise e