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,同时在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
# 尝试寻找元素,如若没有找到则会抛出异常