我正在尝试使用 selenium c# 读取网页上的不可知网格,并希望根据列名称存储文本。我不太喜欢 DataTable,所以我更喜欢 List 而不是 DT。
问题:网格有滚动条,可以向右或向左滚动。由于只有几行,因此没有垂直滚动条。检查完元素后,我发现只为 ag 生成了几个 div。当我使用滚动条向右滚动时,会为右侧列生成 div。一旦我向左滚动,后面生成的 div 就消失了。因此,简而言之,仅为可见列生成 div。
到目前为止我尝试过的:我使用
读取网格IList<IWebElement> agGrid = driver.FindElements(GetLocator("//div[@class='ag-center-cols-container']//div[@role='row']"));
我遍历每一行来获取列值,并尝试了多种方法来读取列值:
foreach (IWebElement row in agGrid)
{
if (row.Text.ToString() == "")
continue;
else
{
//get first row and click on it to hightlight
IList<IWebElement> RowData = row.FindElements(By.TagName("div"));
RowData[0].Click();
//tried to scroll towards end
//IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
//js.ExecuteScript("javascript:window.scrollBy(250,350)");
RowData = row.FindElements(By.TagName("div"));
//get data using colindex attribute. But I was not aware exactly how to do this
//IList<IWebElement> RowData1 = row.FindElements(By.("aria-colindex"));
List<string> dat = RowData.Select(x => x.Text).ToList(); //this doesn't give all the data
//WebElement.SendKeys(Keys.ArrowRight);
//find the horizontal scrollbar element & than scroll
//IWebElement element = driver.FindElement(By.Id("ag-body-horizontal-scroll-container"));
//element.SendKeys(Keys.ArrowRight);
//Actions actions = new Actions(driver);
//actions.MoveToElement(element);
//actions.Perform();
//find the last column and than scroll
IWebElement element = row.FindElement(By.CssSelector("div[@aria-colindex='30']"));
((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].scrollIntoView(true);", element);
Thread.Sleep(500);
}
}
以上方法均无效。所以不得不发帖提问。谁能帮我解决这个问题吗?预先感谢。
我猜你只需要向左滚动一页,收集数据并再次滚动,直到拥有所有内容:
((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].scrollBy(arguments[0].clientWidth, 0);", ScrollableArea.ActualWebElement);