for循环“索引超出范围”c#webdriver

我从这个循环得到“索引超出范围”。 但我需要使用循环创建的新元素,我该怎么做? 请帮助解决问题

int linkCount = driver.FindElements(By.CssSelector("a[href]")).Count; string[] links = new string[linkCount]; for (int i = 0; i < linkCount; i++) { List linksToClick = driver.FindElements(By.CssSelector("a[href]")).ToList(); links[i] = linksToClick[i].GetAttribute("href"); } 

我认为你可以重构你的代码:

 var linkElements = driver.FindElements(By.CssSelector("a[href]")).ToList(); var links = new List(); foreach (var elem in linkElements) { links.Add(elem.GetAttribute("href")); } 

如果可行,您可以简化查询:

 var instantLinks = driver.FindElements(By.CssSelector("a[href]")) .Select(e => e.GetAttribute("href")) .ToList(); 

您可以重写代码以绕过for循环:

 string[] links = driver.FindElements(By.CssSelector("a[href]")).Select(l => l.GetAttribute("href")).ToArray(); 

这也应该避免索引超出范围问题,并减少你必须编写的代码量。

首先,我没有看到在循环中分配linkstoclick值的一点……错误的原因必须是linksToClick列表的长度大于linkCount的长度。

 int linkCount = driver.FindElements(By.CssSelector("a[href]")).Count; List links = new List(); for (int i = 0; i < linkCount; i++) { List linksToClick = driver.FindElements(By.CssSelector("a[href]")).ToList(); if (linksToClick.Count < i) links.Add(linksToClick[i].GetAttribute("href")); } 

这可能有助于超出范围的exception。 这样做可以创建一个type:string列表,而不必显式定义列表的大小

第一个按标签名称获取所有元素…让我们假设为5。

在循环中,您的驱动程序通过css选择器获取所有元素,并且您可能在此处使用不同的数字。 让我们说4。

那么,您可能正在尝试在四元素数组中设置第五个元素。 繁荣。

最容易修复调试:

 int linkCount = driver.FindElements(By.TagName("a")).Count; string[] links = new string[linkCount]; // WRITE OUT HOM MANY links you have for (int i = 0; i < linkCount; i++) { List linksToClick = driver.FindElements(By.CssSelector("a[href]")).ToList(); // ASSERT THAT YOU HAVE THE SAME AMOUNT HERE If (links.Count != linksToClick.Count) // your logic here links[i] = linksToClick[i].GetAttribute("href"); }