我从这个循环中得到“索引超出范围”。但我需要使用循环创建的新元素,我该怎么做?请帮助解决问题
int linkCount = driver.FindElements(By.CssSelector("a[href]")).Count;
string[] links = new string[linkCount];
for (int i = 0; i < linkCount; i++)
{
List<IWebElement> linksToClick = driver.FindElements(By.CssSelector("a[href]")).ToList();
links[i] = linksToClick[i].GetAttribute("href");
}
答案 0 :(得分:1)
我认为您可以重构代码:
var linkElements = driver.FindElements(By.CssSelector("a[href]")).ToList();
var links = new List<string>();
foreach (var elem in linkElements)
{
links.Add(elem.GetAttribute("href"));
}
如果可行,您可以简化查询:
var instantLinks = driver.FindElements(By.CssSelector("a[href]"))
.Select(e => e.GetAttribute("href"))
.ToList();
答案 1 :(得分:1)
您可以重写代码以绕过for循环:
string[] links = driver.FindElements(By.CssSelector("a[href]")).Select(l => l.GetAttribute("href")).ToArray();
这也应该避免索引超出范围问题,并减少你必须编写的代码量。
答案 2 :(得分:0)
int linkCount = driver.FindElements(By.CssSelector("a[href]")).Count;
List<string> links = new List<string>();
for (int i = 0; i < linkCount; i++)
{
List<IWebElement> linksToClick = driver.FindElements(By.CssSelector("a[href]")).ToList();
if (linksToClick.Count < i)
links.Add(linksToClick[i].GetAttribute("href"));
}
这可能有助于超出范围的例外。 这样做可以创建一个type:string列表,而不必明确定义列表的大小
答案 3 :(得分:0)
首先,我没有看到在循环中分配linkstoclick值的一点......错误的原因必须是linksToClick列表的长度大于linkCount的长度。
答案 4 :(得分:-1)
第一个按标签名称获取所有元素...让我们假设为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<IWebElement> 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");
}