List.Count()在DevOps构建上抛出ArgumentOutOfRangeException,但不是在本地

时间:2018-11-05 16:30:47

标签: c# azure selenium azure-devops

所以我今天遇到了一个非常奇怪和令人困惑的问题: 我正在为一家在线书店编写Selenium测试。对于其中一个后备页面,我编写了一个仅创建条目的测试。

要查看其是否有效,我将索引页面上的条目列表处理为一个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:line   66
  在   MyProject.Admin.Test.SeleniumTest.NewsletterBlacklist.CreateBlacklistEntryTest.CreateBlacklistEntry()
  在   C:\ agent_work \ 8 \ s \ MyProject.Admin.Test \ SeleniumTest \ NewsletterBlacklist \ CreateBlacklistEntryTest.cs:line   54

这让我感到困惑,因为当AFAIK List.Count()尝试计算空列表的条目时,它应该只返回0。 List.Any()也不起作用。
这个错误发生在我的两个测试中,其余使用这种验证的测试都没有遇到此错误。

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

班级通讯黑名单页面
这是创建空列表并尝试使用索引页上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;
        }
    }

有指针吗?数小时以来,我一直在尝试新的解决方法和谷歌搜索解决方案。

先谢谢了,
卡尼

1 个答案:

答案 0 :(得分:0)

Jon Skeet.回答的问题 错误不在标记的行上,而是在行上

blacklistItem.Ean = row.ChildNodes.Nodes().ToList()[1].InnerText;

如果表为空,我在哪里尝试访问表中不存在的列。 我只需要检查表是否有任何列,然后再访问它们。