[英]FindLastIndex ArgumentOutOfRangeException when parameter count is less than List.Count
[英]List.Count() throws ArgumentOutOfRangeException on the DevOps build, but not locally
因此,今天我遇到了一個非常奇怪和令人困惑的問題:我正在為一家在線書店編寫Selenium Tests。 對於其中一個后備頁面,我編寫了一個僅創建條目的測試。
為了查看它是否有效,我將索引頁面上的條目列表處理為一個List,並在操作之前和之后讀取List.Count()以查看其是否增加。
這在我的環境中運行完美。 但是:在Azure DevOps構建中,它告訴我
測試方法MyProject.Admin.Test.SeleniumTest.NewsletterBlacklist.CreateBlacklistEntryTest.CreateBlacklistEntry引發異常:System.ArgumentOutOfRangeException:索引超出范圍。 必須為非負數並且小於集合的大小。 參數名稱:索引
堆棧跟蹤說
在System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument參數,ExceptionResource資源)處
在MyProject.Admin.Test.PageObjectModel.Configuration.NewsletterBlacklistPage.get_BlacklistedNewsletterList()
在C:\\ agent_work \\ 8 \\ s \\ MyProject.Admin.Test \\ PageObjectModel \\ Configuration \\ NewsletterBlacklistPage.cs:第66行
在MyProject.Admin.Test.SeleniumTest.NewsletterBlacklist.CreateBlacklistEntryTest.CreateBlacklistEntry()
在C:\\ agent_work \\ 8 \\ s \\ MyProject.Admin.Test \\ SeleniumTest \\ NewsletterBlacklist \\ CreateBlacklistEntryTest.cs:第54行
這讓我感到困惑,因為當AFAIK List.Count()嘗試計算空列表的條目時,它應該只返回0。 List.Any()也不起作用。
此錯誤在我的兩個測試中發生,使用這種驗證的其余測試都沒有遇到此錯誤。
類CreateBlacklistEntryTest
這是我嘗試使用Count()的代碼段(這是嘗試后的解決方法,我想看看使用Any()是否會有不同的結果):
var countBefore = 0;
if (blacklistPage.BlacklistedNewsletterList.Any())
{
countBefore = blacklistPage.BlacklistedNewsletterList.Count();
}
blacklistPage.CreateBlacklistItem($"{Guid.NewGuid()}".Substring(24));
System.Threading.Thread.Sleep(1000);
var countAfter = blacklistPage.BlacklistedNewsletterList.Count();
if (countAfter != countBefore + 1)
{
Assert.Fail("No Blacklist item was added, or too many.");
}
類NewsletterBlacklistPage
這是創建空列表並嘗試使用索引頁上DOM樹中的數據填充它的代碼:
public IList<NewsletterBlacklistModel> BlacklistedNewsletterList
{
get
{
List<NewsletterBlacklistModel> result = new List<NewsletterBlacklistModel>();
// we parse with agility pack, selenium would take too long
var html = new HtmlAgilityPack.HtmlDocument();
html.LoadHtml(Browser.WebDriver.PageSource);
var table = html.DocumentNode.SelectSingleNode("//table[@class='table table-striped']");
// each row in table is one list entry
foreach (var row in table.SelectNodes("tbody/tr"))
{
var blacklistItem = new Model.NewsletterBlacklistModel();
blacklistItem.Cover = row.ChildNodes.Nodes().ToList()[0].InnerText;
blacklistItem.Ean = row.ChildNodes.Nodes().ToList()[1].InnerText;
// blacklistItem.EditButton = Browser.FindElementWait(By.XPath("//button[@id='btn_edit']"));
blacklistItem.DeleteButton = Browser.FindElementWait(By.XPath("//button[@id='btn_delete']"));
result.Add(blacklistItem);
}
return result;
}
}
有指針嗎? 數小時以來,我一直在嘗試新的解決方法和谷歌搜索解決方案。
提前致謝,
卡爾尼
喬恩·斯基特 ( Jon Skeet)回答的問題。 錯誤不在標記的行上,而是在行上
blacklistItem.Ean = row.ChildNodes.Nodes().ToList()[1].InnerText;
如果表為空,我試圖訪問表中不存在的列的位置。 我只需要在訪問它們之前檢查表是否有任何列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.