Применение Selenium WebDriver для тестирования MS Dynamics CRM

  • Tutorial
В данной статье не будет рассказано, что такое Selenium и Selenium WebDriver – по этому поводу написано уже множество замечательных статей.

Здесь я хочу привести лишь небольшой пример того, как можно протестировать клиентский код в MS Dynamics CRM.

Но думаю, парой слов о Selenium WebDriver обмолвиться все же можно.
Итак, Selenium WebDriver – это библиотека, которая позволяет управлять браузером: давать браузеру какие-то команды, заполнять элементы UI, считывать значения, запускать скрипты.

Итак, поехали!



Перво-наперво создадим стандартный Unit Test Project.



Visual Studio заботливо создаст для нас класс теста и метод теста – переименуем их в соответствии с нашей предметной областью.

Затем мы установим следующие штуки посредством nuget: Selenium.WebDriver и WebDriverIEDriver (коли IE является дефолтным браузером для MS Dynamics CRM).



Ну почти всю работу мы сделали:)
Теперь остается написать только наш юнит-тест.

Проверять наш тест будет следующий case: существует два поля «Предполагаемая сумма» и «Взвешенная сумма», при этом «Взвешенная сумма» должна равняться 30% от «Предполагаемая сумма». И данное значение должно устанавливаться клиентским скриптом.

namespace CrmSeleniumUnitTest
{
    [TestClass]
    public class OpportunityTests
    {
        [TestMethod]
        public void WeightedSummCalculate()
        {
            decimal estimatedValue = 1000m;
            decimal expectedWeightedValue = estimatedValue * 0.3m;

            string contentFrame = "contentIFrame";
            string estimatedValueId = "estimatedvalue";
            string weightedEstimatedValueId = "isv_weightedestimatedvalue";
            string weightedEstimatedValueAttribute = "value";

            var driver = new InternetExplorerDriver();

            driver.Navigate().GoToUrl("https://test.crm.crm");
            
            driver.SwitchTo().Frame(contentFrame);

            var estimatedValueElement = driver.FindElement(By.Id(estimatedValueId));

            estimatedValueElement.Clear();
            estimatedValueElement.SendKeys(Keys.Tab);
            estimatedValueElement.SendKeys(estimatedValue.ToString(CultureInfo.InvariantCulture));
            estimatedValueElement.SendKeys(Keys.Tab);

            Thread.Sleep(10000);

            var weightedValueElement = driver.FindElement(By.Id(weightedEstimatedValueId));

            var actualWeightedValue = Decimal.Parse(weightedValueElement.GetAttribute(weightedEstimatedValueAttribute),CultureInfo.InvariantCulture);

            driver.Quit();

            Assert.AreEqual(expectedWeightedValue, actualWeightedValue);
        }
    }
}


Запускаем тест.



Ну вот и все — коротенько и по делу:)
Поделиться публикацией

Комментарии 24

    +1
    И причём тут MS Dynamics CRM?
      –3
      Тут показан один из методов тестирования клиентского кода, который можно применить в MS Dynamics CRM.
      Других адекватных нет, к сожалению. А что вы хотели увидеть особенного?
        +2
        Я вижу супер простой тест через selenium в котором даже есть возможность найти элемент по id. Таким макаром можно было применить любой инструмент для функционального авто тестирования веб приложений. Учитывая это вся статья сводится к установке пары nuget пакетов и примера из любого туториала по selenium коих тысячи. А я ожидал, судя по заголовку, раскрытия уникальных особенностей тестирования MS Dynamics CRM.
          –3
          Особенностей никаких, кроме driver.SwitchTo().Frame(contentFrame);

          Статья призвана показать, что такой подход возможен.
          Никаких уникальных особенностей быть и не может.
            0
            Никаких уникальных особенностей быть и не может.

            Не очень тогда понятно почему
            Других адекватных нет, к сожалению.
              –1
              Из-за особенностей Dynamics CRM. Мы можем писать только обработчики событий, такое тестирование, как например, с использованием Karma, Jasmine тут не подходит. Мы можем лишь «протыкать» UI.
                0
                Итак, вы сравниваете связку karma + jasmine с связкой selenium + mstest и говорите что одно может делать функциональное тестирование веб приложений через ui браузеров, а другое не может. Ну да, действительно это так. Но и из этого автоматом не следует что selenium единственный инструмент который может тестировать MS Dynamics CRM. Или я не понял вашу мысль?
          +1
          А что вы хотели увидеть особенного?

          Хотя бы один нормальный тест всей системы. Начиная с заполнения базы фикстурами.
        –1
        Я пытаюсь сказать, что адекватные инструменты вроде karma+jasmine не подходят для тестирования MS Dynamics CRM.
        И остаются только «протыкивалки», коих много. И вот WebDriver оказался весьма удачным вариантом.
          0
          Не вижу ничего не адекватного в использовании инструментов работающих непосредственно с браузером. Для каждой задачи свой инструмент и тестирование портала в реальном браузере имеет свои плюсы и свои минусы. Однако смысловая нагрузка статьи сжалась в одну строчку,
          Перед тестированием нужно переключиться на frame contentIFrame

          И то явно этой строчки нет, нужно вчитываться в пример.
            –1
            Я и не говорил, что инструменты, работающие непосредственно с браузером, не адекватные.
            Просто по ряду причин, они лучше.
              0
              Ну как же так
              Я пытаюсь сказать, что адекватные инструменты вроде karma+jasmine не подходят для тестирования MS Dynamics CRM.

              Одни инструменты адекватны.
              И остаются только «протыкивалки», коих много.

              А те кто остались не адекватны.
              И да, чем они лучше и при каких условиях?
                –1
                Я что-то вообще ничего не могу понять из вашего последнего поста.
                Можете сформулировать мысль доступно?
                  0
                  Я пока вас никак не могу понять. Одни средства у вас адекватны, другие не адекватны. Одни лучше, другие хуже. В статье это не разбирается Кто, почему, в каких условиях, при каких задачах лучше/хуже. Есть только «ряд причин» и «особенности» которые тоже не расписаны.
          –6
          Ты баран? Где я сказал, что какие-то средства неадекватны? Я же черным по белому написал для MS Dynamics CRM.
            +3
            Добрый день, сегодня пятница 25 декабря и я позволил себе наглость прочитать вашу статью, задавать по ней вопросы и цитировать ваши комментарии. Простите меня, я не хочу быть бараном. А если серьёзно, то я чуть выше цитировал ваш комментарий который дал мне повод увидеть у вас разделение о котором я говорю.
              –1
              Поясняю: есть более подходящие, а есть менее подходящие инструменты. Вот karma+jasmine не подходит для MS Dynamics CRM, а Selenium подходит. И тут нигде не сказано, что какой-то инструмент неадекватен.
                0
                Я конечно могу продолжить и ещё раз процитировать комментарий где было про «адекватные» инструменты, но учитывая что тут не так много комментариев и его так и так видно, не буду. Да и после барана не сильно хочется продолжать общение.
                Однако желаю удачи в использовании выбранных инструментов и буду ждать следующих статей которые
                коротенько и по делу:)
            +1
            Thread.Sleep(10000);
            var weightedValueElement = driver.FindElement(By.Id(weightedEstimatedValueId));

            Почему именно 10000, а не, скажем 5000 или 20000?

            Конечно это жесткий костыль, который сильно влияет на производительность и стабильность тестов.
            Есть такая штука как WebDriverWait:
            IWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10))
            IWebElement element = wait.Until(driver => driver.FindElement(By.Id(weightedEstimatedValueId)));
            

            Будет ждать элемент, пока он не появится либо пока не произойдет таймаут.

            Еще вопрос, почему был выбран именно C#, а не JS, например, для этих целей?
              0
              А кто сказал, что на странице нет элемента с айдишником weightedEstimatedValueId и что этот элемент значение не имеет?
              и чего ждать, когда эту штуку может вычислять долговыполняющийся яваскриптовый код?
                0
                Если я правильно понял, то слип именно для этого. Если нет, прошу прощения — поясните, пожалуйста, назначение слипа в тесте.
                  0
                  значение инпута, который имеет id «weightedEstimatedValueId» может устанавливаться путем выполнения яваскрипта, причем длительного давольно, поэтому тут есть вот такой слип. При этом устанавливается только значение weightedEstimatedValueId и не факт, что из какого-то дефолтного. И как бы нет такого условия, которого бы мы ожидали.
                    0
                    Вас понял. В этом случае я бы ожидал, когда значение элемента управления станет expectedWeightedValue с помощью того же wait.Until. Тогда слип не потребуется.
                      0
                      значение инпута, который имеет id «weightedEstimatedValueId» может устанавливаться путем выполнения яваскрипта, причем длительного давольно, поэтому тут есть вот такой слип
                      Вот и нужно подождать, пока значение инпута изменится с текущего на ожидаемое. Это и будет условие, которого «нет».

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое