如何正确断言元素不存在?尝试两种方法仍遇异常,求技术指导
解决Element Not Found Exception的断言元素不存在问题
你遇到的核心问题是:直接通过_elements.deleteLogBookCategoryButton获取元素时,底层用的是FindElement()(单数)方法,这个方法只要找不到元素就会立刻抛出NoSuchElementException,根本走不到你写的Click()或Displayed判断那一步。
要断言元素不存在,得用不会抛出异常的方式来检查,下面是几种可行的方案:
方案1:用FindElements()(复数)检查元素列表长度
直接通过FindElements()查找目标元素,它找不到元素时会返回空列表,不会抛异常,接着判断列表长度为0即可:
public void AssertDeleteLogBookCategoryButtonIsNotPresent() { // 替换成你实际使用的定位器(By.Id/By.XPath等) var deleteButtonList = driver.FindElements(By.Id("deleteLogBookCategoryButton")); Assert.That(deleteButtonList.Count, Is.EqualTo(0)); }
方案2:修改Page Object的元素定义(适配你的_elements类)
如果用了Page Object模式,把单个元素的定义改成返回元素列表,避免提前触发查找:
// 在你的Elements类里修改属性 public IList<IWebElement> DeleteLogBookCategoryButtons => driver.FindElements(By.Id("deleteLogBookCategoryButton"));
然后在断言方法里判断列表为空:
public void AssertDeleteLogBookCategoryButtonIsNotPresent() { Assert.That(_elements.DeleteLogBookCategoryButtons.Count, Is.EqualTo(0)); }
方案3:结合显式等待确保元素确实不存在
如果页面有加载延迟,建议加显式等待,避免因为元素还未消失就断言导致误判:
public void AssertDeleteLogBookCategoryButtonIsNotPresent() { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); // 等待元素列表变为空 wait.Until(d => d.FindElements(By.Id("deleteLogBookCategoryButton")).Count == 0); // 也可以结合断言 Assert.That(wait.Until(d => d.FindElements(By.Id("deleteLogBookCategoryButton")).Count == 0)); }
另外注意:不要用Assert.Throws<Exception>()来捕获这个异常,因为FindElement()抛出的是NoSuchElementException,不是通用的Exception,而且这种写法不够优雅,不如直接检查元素列表的方式直观可靠。
内容的提问来源于stack exchange,提问作者Keiggo
相关产品推荐
相关产品推荐

