如何在 Selenium 中安全检测两个元素中任意一个是否可见

秋丽同学_1078

秋丽同学_1078

2026-03-25

308人浏览

原创

本文介绍一种健壮、无异常的 Selenium 元素可见性检测方法,通过 find_elements 结合 is_displayed() 判断目标元素是否存在且可见,从而可靠区分“搜索结果列表显示”与“No Results Found 提示显示”两种状态。

本文介绍一种健壮、无异常的 selenium 元素可见性检测方法,通过 `find_elements` 结合 `is_displayed()` 判断目标元素是否存在且可见,从而可靠区分“搜索结果列表显示”与“no results found 提示显示”两种状态。

在基于 React 的动态界面(如带搜索框与结果区的组件)中,搜索结果区域常以两种互斥状态呈现:

  • 搜索命中 → 渲染结果表格(例如 或含 .result-item 类的列表容器);
  • 搜索无匹配 → 显示提示文本

    No Results Found

    。
  • 此时,若直接使用 WebDriverWait 配合 EC.visibility_of_element_located() 或调用 driver.find_element().is_displayed(),极易因元素尚未渲染或已被移除而抛出 NoSuchElementException 或 StaleElementReferenceException —— 尤其在 React 状态切换导致 DOM 节点重建时,这种竞态问题尤为常见。

    ✅ 正确解法是避免依赖单次定位 + 属性访问,转而采用「查找所有匹配节点 → 过滤可见实例 → 判断存在性」的防御式策略。核心在于:

    • driver.find_elements() 永不抛异常,无论元素是否存在,均返回空列表或元素列表;
    • 对每个找到的元素调用 .is_displayed() 是安全的(前提是元素未 stale;而 find_elements 返回的始终是当前活跃引用,且我们仅在查到元素后才调用该方法,风险极低);
    • 最终以 len(displayed_elements) > 0 作为布尔判定依据,语义清晰、稳定可靠。

    以下是推荐封装的工具函数:

    from selenium.webdriver.common.by import By
    from selenium.webdriver.remote.webelement import WebElement
    
    def element_exists_and_displayed(driver, by: By, locator: str) -> bool:
        """
        安全检测元素是否存在且可见(displayed),不抛出 NoSuchElement 异常。
    
        :param driver: WebDriver 实例
        :param by: 定位策略(By.XPATH, By.CSS_SELECTOR 等)
        :param locator: 定位表达式
        :return: True 表示至少有一个匹配元素已渲染且可见,否则 False
        """
        elements = driver.find_elements(by, locator)
        return any(element.is_displayed() for element in elements)

    结合你的 HTML 结构,可这样使用:

    # 假设已定义 XPath(注意修正原问题中的拼写错误:restultsTablePath → resultsTablePath)
    results_table_xpath = "//div[contains(@class, 'related-files-adder')]//table | //div[contains(@class, 'related-files-adder')]//div[contains(@class, 'results-list')]"
    no_results_xpath = "//div[contains(@class, 'related-files-adder')]//p[@class='lead' and text()='No Results Found']"
    
    # 等待搜索完成(例如输入后等待 DOM 更新)
    driver.find_element(By.XPATH, "//input[@placeholder='Search...']").send_keys("test")
    # 可选:显式等待短暂延迟或监听 AJAX/React 状态(如等待某个 loading class 消失)
    
    # 安全判断状态
    if element_exists_and_displayed(driver, By.XPATH, results_table_xpath):
        print("✅ 搜索结果列表已显示,准备点击首个结果...")
        # 示例:点击第一个结果项
        first_result = driver.find_element(By.XPATH, f"{results_table_xpath}//tr[1] | {results_table_xpath}//div[1]")
        first_result.click()
    elif element_exists_and_displayed(driver, By.XPATH, no_results_xpath):
        print("⚠️ 未找到匹配项,准备添加新条目...")
        # 执行添加逻辑,例如点击“Add New”按钮或调用 API
    else:
        print("❌ 既未显示结果也未显示提示——页面可能未加载完成或存在异常")
        # 可在此处加入重试逻辑或截图诊断

    ? 关键注意事项:

    • ✅ 永远不要对 find_element() 的返回值直接调用 .is_displayed() —— 它会在元素不存在时立即崩溃;
    • ✅ 使用 find_elements() 是唯一能绕过 NoSuchElementException 的标准方式;
    • ⚠️ 若页面存在大量动态插入/删除操作,建议在调用前确保父容器已稳定(例如 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "related-files-adder"))));
    • ? XPath 表达式应尽量健壮:优先使用语义化 class 名、data- 属性或层级关系,避免依赖易变的索引或 React 自动生成的类名(如 `Mui`);
    • ? 测试时建议覆盖三种场景:初始空白态、搜索命中态、搜索无果态,并验证函数返回值符合预期。

    该方法已在多个 React/Vue SPA 项目中验证,兼具稳定性与可读性,是处理“二选一动态 UI 状态”检测的推荐实践。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

6195

7

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

3472

4

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

3150

5

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.01

3179

5

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2023.08.11

4899

6

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

2023.08.11

3101

3

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

2929

3

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

2023.09.01

2568

6

HTML嵌入CSS样式的方法
HTML嵌入CSS样式的方法

HTML嵌入CSS样式的方法有内联样式、内部样式表和外部样式表。本专题为大家提供CSS样式相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.20

2648

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习