• selenium 重新封装查找元素的方法


    selenium 虽然有自带的查找元素方法,但是,总感觉有些鸡肋,经常因为网络延迟,而要手动去设置等待时间,虽然,感觉有时候设置等待时间太长,运行Case的时间又过长,设置等待时间太短,页面元素还没有加载完,又导致定位不到元素。所以就想干脆自己封装一个方法,在方法里定义好查找的方式、要查找的内容、等待时间及等待步长。在需要时调用即可。

    以下是自己封装好的代码,通过lxml 的etree 和正则表达式实现的。

    如果有哪位大神有更好的idea ,欢迎交流。

    #encoding:utf-8
    from selenium import webdriver
    from lxml import etree
    import re
    import time
    
    class FindElement(object):
    
        def __init__(self , driver) -> None:
            super().__init__()
            self.driver = driver
        
        def find_element(self ,find_type="xpath" ,find_value=None ,spacing=1 ,duration=10):
            """
            @find_type : 寻找方式, 如xpath 、name 、 class_name 等
            @find_value : 查找元素的值, 如://*[@id="user_icon_mobile"]
            @spacing : 间隔时长,单位:秒。 如 spacing=1 每1秒寻找一次
            @duration : 等待最大时间,单位:秒。 如duration=10 在10秒内不停的寻找find_value 元素,直到找到为止
            """
            start_timestamp = int(time.time())
            stop__timestamp = start_timestamp + duration + 1
    
            if find_type == None :
                raise("find_value的值不允许为:None!")
            
    
            while start_timestamp < stop__timestamp :
            
                #获取当前页面源码
                page_source = self.driver.page_source
    
                #将页面源码转为etree 的结构
                etree_source = etree.HTML(page_source)
    
                #查找页面元素
                if find_type == "xpath" :
                    page_element = etree_source.xpath(find_value)
                    if len(page_element)>0 :
                        element = self.driver.find_element_by_xpath(find_value)
                        return element
                
                #通过正则表达式查找页面元素,找到则返回
                re_value = re.search(find_value , page_source)
                print(re_value)
                if re_value != None :
                    if find_type == "name" :
                        element = self.driver.find_element_by_name(find_value)
                        return element
                    elif find_type == "class_name" :
                        element = self.driver.find_element_by_class_name(find_value)
                        return element
                    elif find_type == "link_text" :
                        element = self.driver.find_element_by_link_text(find_value)
                        return element
                    elif find_type == "partial_link_text" :
                        element = self.driver.find_element_by_partial_link_text(find_value)
                        return element
                    elif find_type == "tag_name" :
                        element = self.driver.find_element_by_tag_name(find_value)
                        return element
                    elif find_type == "css_selector":
                        element = self.driver.find_element_by_css_selector(find_value)
                        return element
                    elif find_type == "id":
                        element = self.driver.find_element_by_id(find_value)
                        return element
    
                time.sleep(1)
                start_timestamp += spacing
  • 相关阅读:
    三款主流静态源代码安全检测工具比较
    原生JS封装ajax以及request
    vue生命周期
    微信 jssdk 逻辑在 vue 中的运用
    JS数组中的indexOf方法
    React和Vue中,是如何监听变量变化的
    Vue2学习小记-给Vue2路由导航钩子和axios拦截器做个封装
    VUE使用中踩过的坑
    Vue系列(一):简介、起步、常用指令、事件和属性、模板、过滤器
    Vue系列(二):发送Ajax、JSONP请求、Vue生命周期及实例属性和方法、自定义指令与过渡
  • 原文地址:https://www.cnblogs.com/JcHome/p/14907326.html
Copyright © 2020-2023  润新知