所以我今天遇到了一个非常奇怪和令人困惑的问题: 我正在为一家在线书店编写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;
}
}
有指针吗?数小时以来,我一直在尝试新的解决方法和谷歌搜索解决方案。
先谢谢了,
卡尼
答案 0 :(得分:0)
由Jon Skeet.回答的问题 错误不在标记的行上,而是在行上
blacklistItem.Ean = row.ChildNodes.Nodes().ToList()[1].InnerText;
如果表为空,我在哪里尝试访问表中不存在的列。 我只需要检查表是否有任何列,然后再访问它们。