上一篇文章我们主要封装了浏览器的操作,这篇文章我们将封装selenium的元素操作。
封装定位元素的方法,selenium提供了多种元素定位方式,css,xpath,id,name等方法。元素定位自然不必多说了,web自动化中的基础操作,也是日常接触的最多的功能,封装的功能只需传两个参数,定位方式与元素对应的属性值。这里可以改造的地方还是有很多的,比如不手动指定,通过持久化或者文件指定对应要查找的元素,需要定位的元素属性也可以通过其他方式进行抽出,进行二次开发时可根据业务需求进行灵活多变的定制。
def get_element(self, by, ele):
element = None
try:
if by == 'id':
element = self.driver.find_element(By.ID, ele)
elif by == 'name':
element = self.driver.find_element(By.NAME, ele)
elif by == 'css':
element = self.driver.find_element(By.CSS_SELECTOR, ele)
elif by == 'class':
element = self.driver.find_element(By.CLASS_NAME, ele)
else:
element = self.driver.find_element(By.XPATH, ele)
except:
session.add(ele_err_msg)
session.commit()
return element
层级元素定位的实现逻辑其实就是根据链式写法产生的,原生的find_element()方法是可以从当前捕捉到的元素层级开始往下再次定位的,我们就利用这一特性,先使用上一个定位元素的方法get_element()来再一次进行find_element()方法,这样就可以实现层级元素的定位操作。
def get_level_element(self, by, ele, ch_by, ch_ele):
element = self.get_element(by, ele)
ch_element = None
try:
if ch_by == 'id':
ch_element = element.find_element(By.ID, ch_ele)
elif ch_by == 'name':
ch_element = element.find_element(By.NAME, ch_ele)
elif ch_by == 'css':
ch_element = element.find_element(By.CSS_SELECTOR, ch_ele)
elif ch_by == 'class':
ch_element = element.find_element(By.CLASS_NAME, ch_ele)
else:
ch_element = element.find_element(By.XPATH, ch_ele)
except:
session.add(ele_err_msg)
session.commit()
return ch_element
输入操作的封装相对比较直白,定位元素并传值即可。需要注意的点就是如果定位的元素本身出了问题的话,我们可以利用判断条件来规避一些异常的情况。
def send_info(self, by, ele, info):
element = self.get_element(by, ele)
if element is not None:
element.send_keys(info)
else:
session.add(null_key_msg)
session.commit()
与输入操作类似
def click_element(self, by, ele):
element = self.get_element(by, ele)
if element is not None:
element.click()
else:
session.add(null_key_msg)
session.commit()
控件的种类还是比较多的,这里就举个比较典型的例子。下面封装的是一个复选框(勾选框),这里的传参前两个就不介绍了,最后一个表示复选框目前的勾选状态,我这里定义的0为未勾选,1为已勾选状态。这里的实现逻辑大致为:判断对象是否为勾选状态,再判断是否需要勾选,结合两种状态一般就是有4个结果,勾选状态下勾选和不勾选、未勾选状态下勾选和不勾选。
def check_box(self, by, ele, selected=None):
element = self.get_element(by, ele)
flag = element.is_selected()
if flag == True:
if selected == 0:
self.click_element(by, ele)
else:
if selected == 1:
self.click_element(by, ele)
对于页面上的某些元素是否可见,我们也可以封装一个方法,用来增强整体的元素定位方法的健壮性,该方法可以直接在元素定位时进行调用,将原有的返回对象进行预先判断。
def ele_display(self, ele):
flag = ele.is_displayed()
if flag == True:
return ele
else:
session.add(ele_dis_msg)
session.commit()