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

时间:2015-09-30 07:33:59

标签: c# loops selenium-webdriver

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

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");
}

5 个答案:

答案 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");
}