千家信息网

定位元素操作

发表于:2025-01-29 作者:千家信息网编辑
千家信息网最后更新 2025年01月29日,# -*- coding:utf-8 -*-# date = 2019/5/13# name = "yedeng"# project_name = python# explain : 从yaml文件中
千家信息网最后更新 2025年01月29日定位元素操作
# -*- 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


0