Python Selenium.WebDriverWait 判断元素是否存在
Posted XianZhe_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python Selenium.WebDriverWait 判断元素是否存在相关的知识,希望对你有一定的参考价值。
Python Selenium.WebDriverWait 判断元素是否存在
一、判断元素是否存在
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_name | find_elements_by_name | 通过Name查找元素 |
find_element_by_xpath | find_elements_by_xpath | 通过XPath查找元素 |
find_element_by_link_text | find_elements_by_link_text | 通过链接文本获取超链接 |
find_element_by_partial_link_text | find_elements_by_partial_link_text | 通过链接文本获取超链接 |
find_element_by_tag_name | find_elements_by_tag_name | 通过标签名查找元素 |
find_element_by_class_name | find_elements_by_class_name | 通过Class name 定位元素 |
find_element_by_css_selector | find_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.WebDriverWait 判断元素是否存在的主要内容,如果未能解决你的问题,请参考以下文章
[python] python+selenium+webdriver