Python Selenium.WebDriver 判断元素是否存在


一、判断元素是否存在

Selenium 中并没有直接判断元素是否存在的方法,因此我们只能通过现有的一些方法自行写一个专门的函数或方法去实现这个目的,在这里我总结了三种方法供大家参考,可以根据各自的优缺点以及应用场景自行选择

关于判断元素是否存在的作用,我想了想主要有这两个方面:

  • 一是先判断该元素是否存在再对其进行操作,这样可以有效避免报错
  • 另外一个就是判断该元素是否存在后,只有存在了再执行一些代码逻辑,比如对页面中的其他元素进行操作

在下例演示中,我将使用xpath表达式或则id对元素进行捕获


二、异常捕获

异常捕获算是最先能想到的方法,在获取元素的时如果元素不存在,则会抛出一个没有搜寻到元素的 NoSuchElementException 异常。
在开始之前,得先知道Selenium将异常都放在selenium.common.exceptions下,需要先行导入这个文件from selenium.common import exceptions

def iselement(browser, xpaths):
    """
    基本实现判断元素是否存在
    :param browser: 浏览器对象
    :param xpaths: xpaths表达式
    :return: 是否存在
    """
    try:
        browser.find_element_by_xpath(xpaths)
        return True
    except exceptions.NoSuchElementException:
        return False

如果不只是判断该元素是否存在这么简单,在存在时还需要对该元素进行处理,按照上面的代码来看,我们需要执行两次捕获行为,第一次为判断,第二次为对元素操作。我们可以对其进行优化以便一次捕获即可。

对于如果只是为了获取元素中的文本,可以这么去写,只需要在原有的基础上进行改进即可

def iselement(browser, xpaths, istest=False):
    """
    实现判断元素是否存在
    :param browser: 浏览器对象
    :param xpaths: xpaths表达式
    :param istest: 如果为True,如果元素存在返回内容将为元素文本内容
    :return: 是否存在
    """
    try:
        target = browser.find_element_by_xpath(xpaths)
    except exceptions.NoSuchElementException:
        return False
    else:
        if istest:
            return target.text
        return True

需要进行其他操作的话,可以直接将元素对象返回

def get_element(browser, xpaths):
    """
    判断是否存在元素并获取元素对象
    :param browser: 浏览器对象
    :param xpaths: xpaths表达式
    :return: 元素对象或为空
    """
    try:
        target = browser.find_element_by_xpath(xpaths)
    except exceptions.NoSuchElementException:
        return
    else:
        return target

对于显示等待的异常,是 exceptions.TimeoutException


三、多元素捕获空判断

Selenium中也有一次查找多个元素的方法,这些方法会返回一个列表

单个元素多个元素描述
find_element_by_id通过ID查找元素
find_element_by_namefind_elements_by_name通过Name查找元素
find_element_by_xpathfind_elements_by_xpath通过XPath查找元素
find_element_by_link_textfind_elements_by_link_text通过链接文本获取超链接
find_element_by_partial_link_textfind_elements_by_partial_link_text通过链接文本获取超链接
find_element_by_tag_namefind_elements_by_tag_name通过标签名查找元素
find_element_by_class_namefind_elements_by_class_name通过Class name 定位元素
find_element_by_css_selectorfind_elements_by_css_selector通过CSS选择器查找元素

对于获取不到的元素,会返回一个空列表,根据是否为空的这个原理,可以判断元素是否存在

def iselement(browser, xpaths, istest=False):
    """
    实现判断元素是否存在
    :param browser: 浏览器对象
    :param xpaths: xpaths表达式
    :param istest: 如果为True,如果元素存在返回内容将为元素文本内容
    :return: 是否存在
    """
    target = browser.find_elements_by_xpath(xpaths)
    if not target:
        return False
    if istest:
        return target[0].text
    return True
def get_element(browser, xpaths):
    """
    判断是否存在元素并获取元素对象
    :param browser: 浏览器对象
    :param xpaths: xpaths表达式
    :return: 元素对象或为空
    """
    target = browser.find_elements_by_xpath(xpaths)
    if target:    
        return target[0]

四、页面源码获取

这种方法不怎么实用,但对于目标内容已经加载出来的页面还是可以考虑使用的
原理很简单,就是将当前页面的源码通过browser.page_source属性获取,再将源码递交给BeautifulSoup 或则 etree 这些库进行处理,进行进一步的数据判断以及提取

from lxml import etree
from bs4 import BeautifulSoup

使用BeautifulSoup进行页面解析

soup = BeautifulSoup(browser.page_source, "html.parser")

使用etree进行页面解析

tree = etree.HTML(browser.page_source)

参考资料💌

由衷感谢💖


相关博客😏

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐