You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium(Python):如何检查按钮已隐藏且不抛出异常?

问题:如何在Selenium中不中断执行检查元素是否隐藏(结合Allure测试)

我正在学习Allure测试,测试通过的条件是目标按钮处于不可见状态。操作流程是:点击第一个按钮让第二个按钮出现,再点击第二个按钮使其消失。但我的代码在检查该按钮是否隐藏时,因为找不到元素直接抛出异常中断执行,想知道怎么实现不中断代码的隐藏检查。

初始代码

class TestPage:

    def test_button(self):
        s=Service('C:\Program Files\chromedriver.exe')
        browser = webdriver.Chrome(service=s)
        browser.get("http://the-internet.herokuapp.com/")
        browser.maximize_window()
        time.sleep(1)
        add = browser.find_element(By.XPATH, "/html/body/div[2]/div/ul/li[2]/a")
        add.click()
        time.sleep(1)
        button = browser.find_element(By.XPATH, "/html/body/div[2]/div/div/button")
        button.click()
        time.sleep(1)
        deleteButton = browser.find_element(By.XPATH, "/html/body/div[2]/div/div/div/button")
        deleteButton.click()
        deleteCheck = browser.find_element(By.XPATH, "/html/body/div[2]/div/div/div/button").is_displayed()
        if deleteCheck == False:
            assert True
        else:
            assert False
        time.sleep(1)
        browser.close()

问题分析

初始代码里用browser.find_element()查找隐藏后的按钮,当元素不存在时会直接抛出NoSuchElementException,导致测试流程直接中断,根本走不到后续的判断逻辑。

解决方案与修改后代码

核心思路是用find_elements()替代find_element()——前者找不到元素时返回空列表,不会抛出异常,我们可以通过判断列表是否为空来确认元素状态。同时用显式等待替代硬等待,让测试更稳定:

def test_button(self):
        s=Service('C:\Program Files\chromedriver.exe')
        browser = webdriver.Chrome(service=s)
        browser.get("http://the-internet.herokuapp.com/")
        browser.maximize_window()
        wait = WebDriverWait(browser, 3)
        time.sleep(1)
        add = browser.find_element(By.XPATH, "/html/body/div[2]/div/ul/li[2]/a")
        add.click()
        time.sleep(1)
        button = browser.find_element(By.XPATH, "/html/body/div[2]/div/div/button")
        button.click()
        time.sleep(1)
        browser.save_screenshot('buttons.png')
        time.sleep(1)
        delete = browser.find_element(By.XPATH, "/html/body/div[2]/div/div/div/button")
        delete.click()
        time.sleep(1)
        wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[onclick*='delete']"))).click()
        time.sleep(0.5)
        if not browser.find_elements(By.CSS_SELECTOR, "button[onclick*='delete']"):
            assert True
        else:
            assert False
        time.sleep(0.5)
        browser.get("http://the-internet.herokuapp.com/")

关键修改说明

  • 避免异常中断:用browser.find_elements()替代browser.find_element(),空列表意味着元素已隐藏/不存在,非空则表示元素仍可见
  • 提升测试稳定性:引入WebDriverWait和EC.element_to_be_clickable(),替代部分time.sleep()硬等待,等待元素可点击后再操作,减少因页面加载延迟导致的错误
  • 优化元素定位:用更简洁的CSS选择器button[onclick*='delete']替代冗长的绝对XPATH,降低后续维护成本
  • 适配Allure报告:添加browser.save_screenshot(),可以在Allure报告中插入关键步骤的截图,提升报告可读性

内容的提问来源于stack exchange,提问作者michalb93

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:31:13