List.Count () создает исключение ArgumentOutOfRangeException при сборке DevOps, но не локально - PullRequest
0 голосов
/ 05 ноября 2018

Итак, я столкнулся с очень странной и запутанной проблемой сегодня: Я пишу 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.

Заранее спасибо,
Карни

1 Ответ

0 голосов
/ 06 ноября 2018

На вопрос ответил Джон Скит. Ошибка была не в отмеченной строке, а в строке

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

Где я пытался получить доступ к столбцу в таблице, который не существует, если таблица пуста. Я просто должен был проверить, есть ли в таблице какие-либо столбцы, прежде чем получить к ним доступ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...