Selenium C#:无需点击聚焦Shadow-Dom网格元素实现滚动
问题:Shadow-Dom Grid组件滚动聚焦问题
我正在自动化Shadow-Dom中的Grid组件,需求是获取该动态Grid的所有行,因此需要执行滚动操作。但目前聚焦Grid时需点击首行,这会触发新页面打开,请问是否存在无需点击即可聚焦Grid以滚动至底部的方法?
已尝试的代码
ClickElement(element); action.MoveToElement(GetElement(element)).SendKeys(pagingKey).Perform();
解决方案
1. 直接聚焦Grid容器而非点击行元素
用Focus()方法替代点击操作,直接将焦点设置到Grid的容器节点(而非首行),避免触发页面跳转:
IWebElement gridContainer = GetElement(gridContainerLocator); gridContainer.Focus(); action.SendKeys(pagingKey).Perform();
2. 使用JavaScript直接滚动(推荐)
绕开焦点依赖,直接通过JS操作Grid的滚动条,这种方式更稳定,尤其适配Shadow-Dom场景:
IWebElement gridElement = GetElement(gridLocator); IJavaScriptExecutor js = (IJavaScriptExecutor)driver; // 滚动到Grid底部 js.ExecuteScript("arguments[0].scrollTop = arguments[0].scrollHeight;", gridElement);
如果Grid在Shadow-Dom内部,需先获取Shadow根节点再定位Grid:
IWebElement shadowHost = driver.FindElement(By.CssSelector("shadow-host-selector")); IWebElement shadowRoot = (IWebElement)js.ExecuteScript("return arguments[0].shadowRoot;", shadowHost); IWebElement gridContainer = shadowRoot.FindElement(By.CssSelector("grid-container-selector")); // 执行滚动 js.ExecuteScript("arguments[0].scrollTop = arguments[0].scrollHeight;", gridContainer);
3. 模拟键盘操作前先定位容器
如果必须用键盘滚动键(如PageDown),可先将鼠标移动到Grid容器区域,再发送按键,无需点击:
IWebElement gridContainer = GetElement(gridContainerLocator); action.MoveToElement(gridContainer).SendKeys(pagingKey).Perform();
内容的提问来源于stack exchange,提问作者Vaibhav Jadia
相关产品推荐
相关产品推荐

