更新Selenium框架后Is Element Present方法失效,元素不存在时抛异常
问题根源分析
异常根本没进入IsElementPresent方法的捕获逻辑——当你调用Driver.IsElementPresent(_eleVal)时,会先执行_eleVal的getter方法,里面的Browser.Driver.FindElement(By.XPath(eleVal))在元素不存在时直接抛出NoSuchElementException,这时候还没走到IsElementPresent的try代码块。
解决方案
方案1:修改IsElementPresent接收定位器而非已定位元素(推荐)
把方法改成接收By类型的定位器,内部用FindElements判断(FindElements不会抛异常,找不到元素返回空列表):
public static bool IsElementPresent(By locator) { try { // 只要找到至少一个元素就返回true return Driver.FindElements(locator).Any(); } catch (StaleElementReferenceException) { return false; } catch (WebDriverException) { return false; } }
调用时直接传定位器,跳过可能抛异常的_eleVal属性:
public bool GetValue() { return Driver.IsElementPresent(By.XPath(eleVal)); }
方案2:修改_eleVal属性避免提前抛异常
如果一定要保留原方法的参数类型,修改_eleVal的getter逻辑,找不到元素时返回null而非直接抛异常:
public IWebElement _eleVal { get { var elements = Browser.Driver.FindElements(By.XPath(eleVal)); // 找不到元素返回null return elements.Count > 0 ? elements[0] : null; } }
然后给IsElementPresent加一个null判断:
public static bool IsElementPresent(IWebElement element) { // 先判断元素是否为null,直接返回false if (element == null) return false; bool result; try { result = element.Displayed; } catch (NoSuchElementException) { return false; } catch (StaleElementReferenceException) { return false; } catch (WebDriverException) { return false; } return result; }
额外优化
GetValue方法可以简化,不需要多余的if-else判断:
public bool GetValue() { return Driver.IsElementPresent(/* 对应参数 */); }
内容的提问来源于stack exchange,提问作者Dazed
相关产品推荐
相关产品推荐

