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