【Python】selenium使用find_element时解决【NoSuchElementException】问题的方法

NoSuchElementException 是 Selenium WebDriver 中的一种异常,我们在写selenium.find_element 的时候也比较常见,它会在我们要尝试定位一个不存在的元素时抛出这类错误。

以下是一些解决NoSuchElementException 的常用方法:

  1. 检查元素定位器: 遇到这个问题,可能是我们的定位元素不在网页上。 这时候,就要我们检查 HTML 源代码,确保我们使用的元素定位器(如 ID、XPath、CSS 选择器等)是正确的,确实存在于页面上。(也有可能是测试看错网址了,也可以检查一下)

  2. 检查页面是否加载完成: 确保在尝试定位元素之前,页面已经完全加载。有时,页面的某些部分可能还在加载中,导致元素暂时不可用。

  3. 检查元素是否可见 : 确保元素不仅存在于页面上,而且是可见的。可以使用 is_displayed() 方法来检查元素是否可见。

python 复制代码
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")

try:
	xpath=""
    element = driver.driver.driver.find_element(By.XPATH,xpath)  
    if element.is_displayed():
        print("元素可见")
    else:
        print("元素不可见")
except Exception as e:
    print("发生异常:", e)
finally:
    driver.quit()

is_displayed() 是 WebElement对象的一个方法,用于检查元素是否在页面上可见。它不仅存在于DOM中,而且其宽高都大于0,并且没有被其他元素遮挡。

以下是 is_displayed() 方法的一些关键点:

复制代码
1. 元素存在性:is_displayed() 首先检查元素是否存在于DOM中。根据返回值,打印出相应的信息。如果元素不存在,将返回 False。

2. 元素可见性:即使元素存在于DOM中,如果它被设置为 display: none 或者 visibility: hidden,或者其宽高为0,is_displayed() 也会返回 False。

3. 元素遮挡:如果元素被其他元素遮挡,例如一个元素的 z-index 属性较低,被另一个 z-index 较高的元素覆盖,is_displayed() 同样会返回 False。

4. 滚动位置:如果元素位于当前视窗之外,即需要滚动才能看到,is_displayed() 会根据元素的任何部分是否在视窗内来判断其是否可见。

5. 使用场景:is_displayed() 通常在自动化测试中用来验证元素是否按预期渲染在页面上,或者在执行某些操作(如点击)之前检查元素是否可见。
  1. 检查元素是否可交互: 确保元素是可交互的,没有被其他元素遮挡,或者没有被禁用。

  2. 使用JavaScript : 如果常规的click() 方法无法定位元素,可以尝试使用 JavaScript 来直接与页面元素交互。

    python 复制代码
    driver.execute_script("arguments[0].click();", element)
  3. 简化选择器: 如果使用复杂的 XPath 或 CSS 选择器,尝试简化它们,或者使用其他类型的选择器。

  4. 检查网络问题: 确保网络连接没有问题,因为网络延迟可能导致页面元素加载失败。

  5. 检查浏览器兼容性: 确保使用的 WebDriver 版本与浏览器版本兼容。

还有一些,面向其他错误也可以用的常规方法:

  1. 使用显式等待: 有时候,元素可能需要一些时间才能加载到页面上。可以使用 Selenium 的显式等待来等待元素出现。

    python 复制代码
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "myElement"))
        )
    except TimeoutException:
        print("在指定时间内未找到元素")
  2. 捕获异常 : 在代码中捕获 NoSuchElementException,并根据需要进行错误处理,比如重试操作、记录错误信息或者终止测试。

python 复制代码
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException

driver = webdriver.Chrome()
driver.get("http://example.com")

try:
    # 尝试定位元素并执行操作
except NoSuchElementException:
    print("未找到元素")
    # 可以在这里添加错误处理逻辑
  1. 刷新页面: 如果元素可能因为页面刷新而丢失,可以尝试在定位元素之前刷新页面。

    python 复制代码
    driver.refresh()

通过上述方法,可以有效地解决 NoSuchElementException 异常,并确保测试脚本能够顺利运行。

相关推荐
重生之后端学习6 小时前
62. 不同路径
开发语言·数据结构·算法·leetcode·职场和发展·深度优先
tang777896 小时前
爬虫代理IP池到底有啥用?
网络·爬虫·python·网络协议·tcp/ip·ip
sg_knight6 小时前
设计模式实战:享元模式(Flyweight)
python·设计模式·享元模式·flyweight
墨有6666 小时前
基于弦论流体对偶与环空间约化的湍流精确数值模型
python·流体力学·弦理论
栗子~~6 小时前
hardhat 单元测试时如何观察gas消耗情况
开发语言·单元测试·区块链·智能合约
The hopes of the whole village6 小时前
Matlab FFT分析
开发语言·matlab
兰文彬7 小时前
n8n 2.x版本没有内嵌Python环境
开发语言·python
yiyaozjk7 小时前
Go基础之环境搭建
开发语言·后端·golang
谁动了我的代码?7 小时前
VNC中使用QT的GDB调试,触发断点时与界面窗口交互导致整个VNC冻结
开发语言·qt·svn
We་ct7 小时前
LeetCode 212. 单词搜索 II:Trie+DFS 高效解法
开发语言·算法·leetcode·typescript·深度优先·图搜索算法·图搜索