定位元素操作
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,# -*- coding:utf-8 -*-# date = 2019/5/13# name = "yedeng"# project_name = python# explain : 从yaml文件中
千家信息网最后更新 2026年11月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安全错误
数据库的锁怎样保障安全
互联网新科技
湖北九亚互联网络科技有限公司
广州大一互联网络科技有限公司
互联网和科技创新
科技类互联网
互联网金融 科技
互联网络科技有限公司
北京互联网科技公司
合肥互联网科技公司
融贸通互联网科技
互联网前沿科技
盛创互联网科技有限公司
太原新华互联网科技学校怎么样
青海省互联网新科技
中盈科技互联网信息有限公司
阿里互联网科技企业
互联网科技数字货币
2021世界互联网领先科技成果发布
全球科技与互联网公司市值变化
容联科技互联网电商
花魁咖啡
深圳科技互联网
互联网科技作文
紫鲸互联网科技
掌上梦互联网科技
现代科技和互联网有关系吗
富国互联网金融科技混合基金
版纳互联网科技选哪家
西安左小互联网科技有限公司
数字科技和互联网金融哪个好