定位元素操作
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,# -*- coding:utf-8 -*-# date = 2019/5/13# name = "yedeng"# project_name = python# explain : 从yaml文件中
千家信息网最后更新 2025年12月03日定位元素操作
# -*- coding:utf-8 -*-# date = 2019/5/13# name = "yedeng"# project_name = python# explain : 从yaml文件中读取返回webelementimport yamlfrom selenium.webdriver.remote.webdriver import WebDriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.remote.webelement import WebElementfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.common.exceptions import TimeoutExceptionfrom utils.FindWebElemet import FindWebElementfrom utils.FindBy import FindByfrom utils.log import Logfrom utils.ReadIni import Readini# yaml文件位置# Readin 读取配置文件中的等待时间''' 初始化添加对应的yaml文件位置,然后调用getAllValue方法,调用 getelement方法获取到对应的webelement 改进方法:保证yaml的文件名和test_case的文件名或者类名一致'''class ReadyamlToElement: # 获取当前脚本所在文件夹路径 def __init__(self, driver: WebDriver, yamlpath): """ 实例化readyaml类 :param driver: :param yamlpath: 对应的yaml文件名 """ self.__yamlPath = yamlpath self.__driver = driver def __getAllValue(self): """ 将指定yaml文件转化为dic字典,key为 :return dic字典 """ ''' curPath = os.path.dirname(os.path.realpath(__file__)) # 获取yaml文件路径 yamlPath = os.path.join(curPath, "cfgyaml.yaml") print(type(yamlPath)) ''' with open(self.__yamlPath, 'r', encoding='utf-8') as f: cfg = f.read() dic_yaml = yaml.load(cfg, Loader=yaml.FullLoader) # 用load方法转字典 return dic_yaml ''' 通过key获取到对应的webelement,改进方法,将其全部遍历后,生成key:element的字典,从里面取对应的数据 ''' def getelement(self, key) -> WebElement: """ 通过yaml文件的key获取到对应的Webelement :param key: yaml文件的key :return: 对应的WebElement对象 :rtype keyelement: selenium.webdriver.remote.webelement """ dic = ReadyamlToElement(self.__driver, self.__yamlPath).__getAllValue() # 接受readyaml().getAllValue()返回的dict # print(dic) if key in dic: list_value = dic.get(key) # list_Type_value = list_value[0].split(":")[1] #获取type的值 # list_Value_value = list_value[1].split(":")[1] #获取value的值 list_Type_value = list_value.get("Type") # 获取type的值 list_Value_value = list_value.get("Value") # 获取value的值 keyelement = FindWebElement(self.__driver, list_Type_value, list_Value_value).find_element(self.__yamlPath, key) # 用于返回webelement对象 Log.info(self.__yamlPath + "中获取到该element,通过该key:" + key) return keyelement else: Log.error(self.__yamlPath + "中不存在该key:" + key + ":关闭程序") # self.__driver.quit() def getelements(self, key) -> list: """ 通过yaml文件的key获取到对应的Webelement :param key: yaml文件的key :return: 对应的WebElement对象 类型为WebElement :rtype keyelements: list """ dic = ReadyamlToElement(self.__driver, self.__yamlPath).__getAllValue() # 接受readyaml().getAllValue()返回的dict # print(dic) if key in dic: list_value = dic.get(key) # list_Type_value = list_value[0].split(":")[1] #获取type的值 # list_Value_value = list_value[1].split(":")[1] #获取value的值 list_Type_value = list_value.get("Type") # 获取type的值 list_Value_value = list_value.get("Value") # 获取value的值 keyelementlist = FindWebElement(self.__driver, list_Type_value, list_Value_value).find_elements(self.__yamlPath, key) # 用于返回webelement对象 Log.info(self.__yamlPath + "中获取到该element,通过该key:" + key) return keyelementlist else: Log.error(self.__yamlPath + "中不存在该key:" + key + ":关闭程序") # self.__driver.quit() def getelementsintnum(self, key, intnum=0) -> WebElement: """ 通过yaml文件的key获取一组WebElemnts,通过数组下标获取对应的WebElemnt :param key: yaml文件的key :param intnum 数组下标 :type key : String :type intnum : int :return: 对应的WebElement对象 :rtype keyelements[intnum]: selenium.webdriver.remote.webelement """ dic = ReadyamlToElement(self.__driver, self.__yamlPath).__getAllValue() # 接受readyaml().getAllValue()返回的dict # print(dic) list_keyelements = [] if key in dic: list_value = dic.get(key) # list_Type_value = list_value[0].split(":")[1] #获取type的值 # list_Value_value = list_value[1].split(":")[1] #获取value的值 list_Type_value = list_value.get("Type") # 获取type的值 list_Value_value = list_value.get("Value") # 获取value的值 list_keyelements = FindWebElement(self.__driver, list_Type_value, list_Value_value).find_elements(self.__yamlPath, key) # 用于返回webelement对象 Log.info(self.__yamlPath + "中获取到该element,通过该key:" + key) else: Log.error(self.__yamlPath + "中不存在该key:" + key + ":关闭程序") # self.__driver.quit() # 判断输入的值是否正确,正确则正确找到,否则就报空 if -len(list_keyelements) <= intnum < len(list_keyelements): return list_keyelements[intnum] else: Log.error("当前输入的intnum大于" + str(len(list_keyelements)) + "有问题") return None def getelementsstringtext(self, key, strtext: str, attributename=None) -> WebElement: """ 通过yaml文件的key获取一组WebElemnts,通过指定元素的值获取到对应的WebElemnt :param key: yaml文件的key :param strtext 对应元素的值 :type key : str :type strtext : str :param attributename 元素的属性值,Name of the attribute/property to retrieve :type attributename : str :return: 对应的WebElement对象 :rtype element: selenium.webdriver.remote.webelement """ dic = ReadyamlToElement(self.__driver, self.__yamlPath).__getAllValue() # 接受readyaml().getAllValue()返回的dict # print(dic) list_keyelements = [] if key in dic: list_value = dic.get(key) # list_Type_value = list_value[0].split(":")[1] #获取type的值 # list_Value_value = list_value[1].split(":")[1] #获取value的值 list_Type_value = list_value.get("Type") # 获取type的值 list_Value_value = list_value.get("Value") # 获取value的值 list_keyelements = FindWebElement(self.__driver, list_Type_value, list_Value_value).find_elements(self.__yamlPath, key) # 用于返回webelement对象 Log.info(self.__yamlPath + "中获取到该element,通过该key:" + key) else: Log.error(self.__yamlPath + "中不存在该key:" + key + ":关闭程序") # self.__driver.quit() # 判断输入的值是否正确,正确则正确找到,否则就报空 booleanfind = False element = None # 当没有设备属性值时用元素的text值 if attributename is None: for webelement in list_keyelements: if webelement.text == strtext: element = webelement booleanfind = True break # 当设备属性值时用元素的指定的属性值的内容 else: for webelement in list_keyelements: if webelement.get_attribute(attributename) == strtext: element = webelement booleanfind = True break if booleanfind: return element else: Log.error(self.__yamlPath + "中未找到对应的元素值,请确认" + strtext + "的正确") return element def waitgetelement(self, key): """ 通过yaml文件的key获取到对应的Webelement,加入了显示等待,WeblEment.is_displayed()为真时返回该该webElement :param key: yaml文件的key :return: 对应的WebElement对象 """ try: inttime = Readini().getvalue("webdriver", "implicit_waitTime") WebDriverWait(self, int(inttime)).until(lambda x: x.getelement(key).is_displayed()) return self.getelement(key) except Exception as e: Log.error(self.__yamlPath + "中该元素不存在:" + key + "导致错误:" + e.__str__()) # self.__driver.quit() def waitgetelements(self, key): """ 通过yaml文件的key获取到对应的Webelement,加入了显示等待,WeblEment.is_displayed()为真时返回该该webElement :param key: yaml文件的key :return: 对应的WebElement对象 """ try: inttime = Readini().getvalue("webdriver", "implicit_waitTime") WebDriverWait(self, int(inttime)).until(lambda x: x.getelement(key).is_displayed()) return self.getelements(key) except Exception as e: Log.error(self.__yamlPath + "中该元素不存在:" + key + "导致错误:" + e.__str__()) # self.__driver.quit() def waitgetelement_clickable(self, key) -> WebElement: """ 通过yaml文件的key获取到对应的Webelement,当元素可以点击时返回webelement :param key: yaml文件的key :return: 对应的WebElement对象 :rtype keyelement: selenium.webdriver.remote.webelement """ dic = ReadyamlToElement(self.__driver, self.__yamlPath).__getAllValue() # 接受readyaml().getAllValue()返回的dict if key in dic: list_value = dic.get(key) list_Type_value = list_value.get("Type") # 获取type的值 list_Value_value = list_value.get("Value") # 获取value的值 try: # 显式等待时间 inttime = Readini().getvalue("webdriver", "implicit_waitTime") # 配合expected_conditions当元素可以点击时返回element elemnet = WebDriverWait(self.__driver, int(inttime)).until(EC.element_to_be_clickable(( FindBy(list_Type_value).find_by(), list_Value_value)), (self.__yamlPath + "中No such element : 请检查该'" + key + "'对应下的Value值是否能在页面上定位成功")) return elemnet except TimeoutException as e: Log.error(e.__str__()) def getlocator(self, key) -> tuple: """ 返回location 元组类型的值,主要给EC模块入参使用 :param key : yaml文件的key :return: tup_locator 元组类型的值如(By.Id,"value") :rtype tup_locator : tuple """ dic = ReadyamlToElement(self.__driver, self.__yamlPath).__getAllValue() # 接受readyaml().getAllValue()返回的dict if key in dic: list_value = dic.get(key) # list_Type_value = list_value[0].split(":")[1] #获取type的值 # list_Value_value = list_value[1].split(":")[1] #获取value的值 list_Type_value = list_value.get("Type") # 获取type的值 list_Value_value = list_value.get("Value") # 获取value的值 tup_locator = (FindBy(list_Type_value).find_by(), list_Value_value) if len(tup_locator) is None: Log.error(self.__yamlPath + "中请检查该'" + key + "'的值是否正确") else: return tup_locator
文件
对象
元素
方法
字典
属性
程序
文件名
类型
下标
位置
数组
时间
设备
路径
错误
检查
输入
定位
一致
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全绿色上网内容
淘宝的服务器在哪
网络安全家喻户晓
zblog换服务器
网络技术挑战赛哪个简单
有木互联网科技有限公司
文件关系型数据库的组织包括
遵化创新软件开发常见问题
服务器远程管理卡 外网可用
忻州软件开发应用范围
网络安全手抄报模板免费
简答题计算机网络安全的五个特征
逆战哪个服务器最肥
西安网络安全周
网络安全法 上升
数据库中权限的作用
手机银行公开数据库
组态王数据库哪种好
国家有关网络安全的法律法规
pz 服务器
什么是刀片式服务器
数据库技术理论知识总结
驱动接口软件开发
剑灵服务器位置
计算机网络技术与小学教育哪个好
什么叫建模 软件开发
如何在cmd表里添加数据库
人渣游戏中怎么看服务器
5g移动通信网络技术的有点
量化用什么数据库