如何使用Python和Appium检查元素不存在?代码异常求助
问题分析与修复方案
核心问题梳理
你的代码存在三个关键问题,导致元素明明不存在但测试却“成功执行”:
- 逻辑完全倒置:当前函数在元素存在时返回
True,不存在时返回False,和你“检查元素不存在”的需求完全相反。 - 异常捕获不全:仅捕获了
NoSuchElementException,但如果元素存在但不可见,is_displayed()返回False会触发AssertionError,当前代码未处理这个异常,会直接导致测试报错而非正确判断。 - 语法错误:
check_element_nonexistent函数定义行末尾缺少冒号,这会直接引发代码运行错误(你可能是输入时的笔误,但必须修正)。
修复后的代码实现
方案一:优化异常捕获+修正逻辑
修改home_page.py中的check_element_nonexistent方法:
from selenium.common.exceptions import NoSuchElementException # 修正后的检查元素不存在的方法 def check_element_nonexistent(self, element): try: if element == 'Some Tab': element_obj = self.el_some_tab() # 元素存在且可见,不符合需求,返回False if element_obj.is_displayed(): return False except (NoSuchElementException, AssertionError): # 元素找不到或不可见,符合“不存在”要求,返回True return True # 元素存在但不可见的情况,同样返回True return True
方案二:更简洁的find_elements写法(推荐)
用find_elements替代find_element,无需捕获异常,直接通过返回列表的长度判断元素是否存在:
from appium.webdriver.common.appiumby import AppiumBy def check_element_nonexistent(self, element): if element == 'Some Tab': # find_elements找不到元素时返回空列表 elements = self.driver.find_elements(AppiumBy.ACCESSIBILITY_ID, self.some_tab) # 空列表(元素不存在)或元素不可见,都返回True return len(elements) == 0 or not elements[0].is_displayed() return False
配套步骤定义优化
在home_step.py中添加断言,确保测试失败时能明确报错:
@Then('the screen is verified') def step_impl(context): assert context.app.home_page.check_element_nonexistent('Some Tab'), "元素'Some Tab'不应该存在"
内容的提问来源于stack exchange,提问作者krisc
相关产品推荐
相关产品推荐

