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

 

posted @ 2021-06-20 17:28  西夏一品唐  阅读(289)  评论(0编辑  收藏  举报