2015-09-30 82 views
1

我從這個循環中得到「索引超出範圍」。但我需要使用循環創建的新元素,我該怎麼做?請幫忙解決這個問題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<IWebElement> linksToClick = driver.FindElements(By.CssSelector("a[href]")).ToList(); 
    links[i] = linksToClick[i].GetAttribute("href"); 
} 
+1

是的,你試圖訪問基於不同列表計數的列表元素。它看起來像點擊鏈接只需要移動到for循環之外,然後'鏈接'需要這個列表的計數。 – Sayse

+1

不要在每次迭代循環中創建'List ',而是在循環之前創建一個'List '。 –

+0

'linksToClick'的長度與'links'不一樣。在外部循環中存儲'linksToClick'一次並在循環內使用它。如果它出於某種原因必須在循環內部,那麼我們不是你的調試器。 –

回答

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

但如果我需要使用所有新鏈接循環創建,我如何使linkCount列表不會失敗,因爲它獲得的靜態數字? – safary

+0

你的問題是內部循環列表較小。定義循環開始的數組和列表OUTSIDE。然後從1運行到更小的值,設置一切你真的可以。 – Noctis

+0

您的兩個列表與OP的地址相同。 MiłoszWieczorek's是更高效,更正確的方法。 – JeffC

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

這可能與超出範圍例外的幫助。 這樣做可以讓你創建類型的列表:無需顯式定義列表的大小

+0

我的確覺得最好是定義一次linksToClick .... 當然,在這個循環運行的空間中,count不會變化太多...... –

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

您可以重寫代碼繞過for循環:

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

這也應該避免索引超出範圍的問題,並減少你必須編寫的代碼量。

0

首先,我沒有看到在循環內指定linkstoclick值的一個點...並且錯誤的原因必須是linksToClick列表的長度超過linkCount的長度。

+0

我試圖做測試,當他打開時發現新的元素另一頁,我雖然我可以用這樣的循環做到這一點。是的,我知道我得到錯誤的原因,但我不知道如何使它工作 – safary