簡體   English   中英

List.Count()在DevOps構建上引發ArgumentOutOfRangeException,但不在本地

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM