Итак, я столкнулся с очень странной и запутанной проблемой сегодня:
Я пишу 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 \ Конфигурация \ 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;
}
}
Есть указатели? Я часами пробовал новые обходные пути и решения для поиска в Google.
Заранее спасибо,
Карни