C# SpecFlow中向XPath传数据表ID触发scrollIntoView报错如何解决?
问题原因
- 触发报错的核心问题是调用
IJavaScriptExecutor.ExecuteScript时传入的第二个参数错误:你传入的AllList.Contains(path)是布尔类型的返回值,仅会得到true或false,而scrollIntoView是DOM元素专属的JS方法,在布尔值上调用该方法自然会抛出「函数不存在」的异常。 - 额外存在冗余逻辑问题:你先全量查询了所有li元素,又单独查询了目标ID对应的span元素,两次DOM查询没有必要,且如果未滚动到目标位置就直接调用
path.Displayed,可能触发元素不可见的异常。
解决方案
基础修复版(直接解决报错)
直接将JS执行的入参替换为目标元素即可,修复后代码如下:
// 从SpecFlow场景大纲参数中传入ID定位目标元素 var path = driver.FindElement(By.XPath("//span[contains(text(),'" + ID + "')]")); IJavaScriptExecutor je = (IJavaScriptExecutor)driver; // 直接传入目标元素作为JS的arguments[0] je.ExecuteScript("arguments[0].scrollIntoView(false);", path); Thread.Sleep(2000); if (path.Displayed) { path.Click(); }
优化版(保留列表校验逻辑)
如果你确实需要先校验目标元素是否在指定的li列表内,可按以下逻辑调整:
IList<IWebElement> AllList = new List<IWebElement>(driver.FindElements(By.XPath("//*[@id='Myul']/li"))); var path = driver.FindElement(By.XPath("//span[contains(text(),'" + ID + "')]")); // 先判断目标span是否属于列表内的元素 if (AllList.Any(li => li.FindElements(By.XPath(".//span[contains(text(),'" + ID + "')]")).Count > 0)) { IJavaScriptExecutor je = (IJavaScriptExecutor)driver; je.ExecuteScript("arguments[0].scrollIntoView(false);", path); Thread.Sleep(2000); if (path.Displayed) { path.Click(); } }
内容的提问来源于stack exchange,提问作者Tester
相关产品推荐
相关产品推荐

