如何编写Assert断言校验虚拟用户登录时指定元素不显示?
非管理员场景下Edit按钮隐藏的断言实现
你用到的Edit按钮定位符如下:By.xpath("//button[@id='Edit']")
先提最容易踩的坑:别直接写driver.findElement(xxx).isDisplayed()做判断,非管理员场景下这个按钮根本不会出现在DOM树里,调用findElement的时候会直接抛NoSuchElementException,断言逻辑根本不会执行,还会把用例打成代码错误而非业务校验失败。
通用稳妥写法(全Selenium版本、全语言绑定适用)
用findElements方法匹配定位符,拿到所有符合规则的元素集合,判断集合长度为0即可。这个方法不会抛异常,找不到元素的时候会直接返回空集合,是行业内通用的稳定方案。
以Java+TestNG技术栈为例:
// 先等页面核心模块加载完成,避免页面没渲染完就判断导致误报,比如等页面用户名展示元素加载完成 new WebDriverWait(driver, Duration.ofSeconds(10)) .until(ExpectedConditions.visibilityOfElementLocated(By.id("userInfo"))); // 查找所有匹配规则的Edit按钮 List<WebElement> editButtonList = driver.findElements(By.xpath("//button[@id='Edit']")); // 断言:没有匹配到任何元素,说明按钮未展示 Assert.assertEquals(editButtonList.size(), 0, "非管理员身份登录时,Edit按钮不应该出现在页面中");
Python栈写法逻辑完全一致:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import pytest # 等页面核心元素加载完成 WebDriverWait(driver, 10).until(EC.visibility_of_element_located(("id", "userInfo"))) edit_btns = driver.find_elements("xpath", "//button[@id='Edit']") assert len(edit_btns) == 0, "非管理员身份登录时,Edit按钮不应该出现在页面中"
Selenium 4 简化写法
如果项目用的是Selenium 4及以上版本,可以直接结合显式等待的反向条件写断言,不用手动处理元素集合:
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5)); boolean isEditBtnHidden = wait.until( ExpectedConditions.not(ExpectedConditions.presenceOfElementLocated(By.xpath("//button[@id='Edit']"))) ); Assert.assertTrue(isEditBtnHidden, "非管理员登录场景下Edit按钮未按要求隐藏");
注意事项
- 不要用捕获
NoSuchElementException的方式判断元素不存在,异常捕获性能差,还容易把其他定位写错的问题误判成「元素不存在」,稳定性极差。 - 断言前一定要加页面加载完成的等待,别刚跳转到页面就立刻查元素,不然页面还在渲染的时候就算是管理员账号也可能暂时查不到按钮,导致用例误报。
内容的提问来源于stack exchange,提问作者abhi
相关产品推荐
相关产品推荐

