# -*- coding:utf-8 -*-
# date = 2019/5/13
# name = "yedeng"
# project_name = python
# explain : 从yaml文件中读取返回webelement
import yaml
from selenium.webdriver.remote.webdriver import WebDriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from utils.FindWebElemet import FindWebElement
from utils.FindBy import FindBy
from utils.log import Log
from 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
创新互联公司是一家以
网站建设公司、网页设计、品牌设计、软件运维、
网站推广、小程序App开发等移动开发为一体互联网公司。已累计为
成都葡萄架等众行业中小客户提供优质的互联网建站和软件开发服务。
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
文章题目:定位元素操作-创新互联
链接地址:
http://cdxtjz.com/article/dgeoid.html