一、判断元素是否存在

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)

参考资料💌

由衷感谢💖

相关博客😏

通过自己上网查找资料,在Python中成功 安装了selenium,同时在PyCharm里面也成功安装了selenium,并将下列三个小问对应的解决方法封装在一个类里。webelement_handler.py webelement_handler.py """使用selenium 操作Web元素""" from selenium import webdriver class WebElementHandler(): """网页元素处理类""" def __init__(self, url): """url:需要测试网页的url(服务器上的网页用域名,本 Python+Selenium爬虫–判断元素是否存在 前言:最近在学习爬虫时,由于要在同一个函数中实现寻找多个网页元素,找了很多资料也没有发现有能判断元素是否存在的,所以我整理了一下找到的部分答案和我自己写的解决方法。 文章目录Python+Selenium爬虫--判断元素是否存在is_displayed()try/except处理异常解决方法 is_displayed() 有些资料说用is_displayed(),但是这个函数只能在元素确定存在的情况下判断元素是否存在,如果该元素不存在的话,依然会抛出 selenium中如果去寻找元素,而元素不存在的话,通常会抛出NoSuchElementException 导致测试失败,但有时候,我们需要去确保页面元素不存在,才是我们正确的验收条件下面的方法可以用来判定页面元素是否存在 public boolean doesWebElementExist(WebDriver driver, By selector) try { ... 1、前面有介绍过使用Python中的sleep()方法来进行等待:等待一定的时间,让元素加载出来后再执行代码 ⑴但是元素加载出来的时间是不固定的,有时长有时短,因此我们等待的时间就不固定了 ⑵最好的办法是:每隔一定的时间后使用Selenium中的一些方法来判断元素是否加载了出来(这个就是后面要介绍的"显式等待") ①元素加载出来了,就不继续等待了 ②元素未加载出来,就继续等待 2、另外就是在做自动化的时候,有时候会需要判断元素是否存在,i... from selenium import webdriver import unittest from selenium.webdriver.common.action_chains import ActionChains class test1(unittest.T... 定位元素过程中,经常会遇到元素明明定位成功了,但是报错却提示确实没有找到,这就是面试过程中经常遇到的元素不可见的问题。 元素不可见 首先要想到是什么属性导致元素不可见,然后我们可以通过修改这个属性进行确认。 hidden=“hidden” 元素的可见与不可见通过hidden这个属性来控制的。在一个元素前面加上这个属性就会导致当前元素不可见。 这里举个小栗子: 这里先找个正常的输入框 用户名:<br> <input type="te arguments[0].setAttribute('style', arguments[1]);, element, border: 2px solid red; #边框border:2px; red红色 arguments[0] 这个参数,可以理解为python中的字符串格式化。比如”{}{}”.format(‘aaa’,’bbbb’) 这里写自定义目录标题Selenium自动化之判断元素是否存在判断元素是否存在,driver.find_element(by=by, value=value),找不到这个元素则报异常页面运行结果 Selenium自动化之判断元素是否存在 判断元素是否存在,driver.find_element(by=by, value=value),找不到这个元素则报异常 import unittest import time from selenium import webdriver from selenium.comm def getElementExistance(self, dr, element_xpath): """通过元素xpath判断是否存在元素,存在返回true,不存在返回false""" element_existance = True # 尝试寻找元素,如若没有找到则会抛出异常