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
相关产品推荐
相关产品推荐

