Привет, Хабр! Меня зовут Татьяна Ошуркова, я разработчик и системный аналитик. Не так давно у меня вышла статья Не базовые навыки. Как расширить свои возможности и найти новые подходы в работе, где я поделилась различными навыками и инструментами, которые могут быть полезны не только разработчику, но также и системному аналитику.

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

19 сентября я проведу вебинар: «Python для системного аналитика. Введение в практику», где подробно поделюсь тем, как изучить и начать использовать Python, а также на практике разберу, как внедрить Python в свою работу. Зарегистрироваться можно в моем телеграмм канале.

Начнём с проблематики. Одна из наиболее частых проблем, с которой я сталкиваюсь и как системный аналитик, и как разработчик – это поиск кейсов или воспроизведение ошибок для их проработки и исправления. Более того, это также касается тестирования реализованного функционала.

Возьму пример из практики. Ко мне пришло обращение клиента, где при заполнении кредитной заявки после отправки возникает ошибка. Так как на боевой среде под клиентом я не могу воспроизвести данный кейс, для решения мне необходимо найти тестового клиента, под которым я смогу повторить ошибку и отладить функционал. В данном случае я выступала сразу в обеих ролях. Если рассмотреть данную проблему со стороны системного аналитика, то мне либо необходимо также найти кейс для воспроизведения и разбора ошибки, либо сразу отдать задачу в разработку, что будет не совсем корректно.

В такой ситуации возникает потребность в автоматизации. Так как для поиска проблемного кейса нужно заполнять руками и отправлять кредитный заявки, полей в которых огромное количество. Возникает объемная повторяющаяся ручная работа, которая не принесёт радости ни системному аналитику, ни разработчику.

Один мой коллега поделился со мной идеей использования в работе такого инструмента, как Selenium. Вспомнив заполнение кредитных заявок, я поняла, что это как раз то решение, которое отлично подойдет системному аналитику в схожих ситуациях.

Перейдем к практике и посмотрим, что необходимо для использования Selenium в работе и какие шаги необходимо выполнить для решения задач.

По какому алгоритму мы будем действовать:

  1. Запись действий через браузер и Selenium IDE

  2. Экспорт кода на Python

  3. Написание скрипта для тестирования

  4. Анализ результатов

Для использования Selenium в работе нужно установить Selenium IDE, я использую соответствующий плагин в Google Chrome.

С помощью Selenium IDE можно записать действия, которые выполнятся для тестирования руками. В моем случае это заполнение кредитной заявки. Я ставлю запись, заполняю заявку, отправляю ее и останавливаю запись.

Далее необходимо экспортировать полученную запись в виде кода. Я экспортирую ее в формате Python pytest.

Теперь давайте посмотрим на фрагмент экспортированного нами исходный код. В нем описаны команды, которые были выполнены нами при записи.

self.driver.get("http://127.0.0.1:5000/createcase")
self.driver.set_window_size(834, 661)
self.driver.find_element(By.ID, "creditProgram").click()
dropdown = self.driver.find_element(By.ID, "creditProgram")
dropdown.find_element(By.XPATH, "//option[. = 'Программа 2']").click()
self.driver.find_element(By.ID, "loanAmount").click()
self.driver.find_element(By.ID, "loanAmount").send_keys("2")
self.driver.find_element(By.ID, "loanPeriod").click()
self.driver.find_element(By.ID, "loanPeriod").send_keys("2")
self.driver.find_element(By.ID, "lastName").click()
self.driver.find_element(By.ID, "lastName").send_keys("2")
self.driver.find_element(By.ID, "firstName").click()
self.driver.find_element(By.ID, "firstName").send_keys("2")

Функция find_element обращается к элементам страницы по их наименованию в разметке и далее с помощью функций click и send_keys воспроизводятся те действия, которые были выполнены нами вручную: нажатие, заполнение и т.д.

Следующим шагом напишем скрипт с использованием полученного кода. Так как нашей целью является автоматизация, нам необходимо, чтобы скрипт работал по множеству тестовых кейсов и выполнял повторение ручных действий за нас.

Для начала нам потребуется подготовить данные для тестирования. Сформируем текстовый файл, где построчно пропишем данные по каждому тестовому клиенту.

4683 59 Bender Robin Karen 1930-03-02 7644 583899 1976-08-31 Perez 65851663310 College Moscow,Russia Moscow,Russia +79862451427
3538 59 Summers Margaret Daryl 1938-04-02 7650 858357 1951-07-03 Johnson 80712994342 University Moscow,Russia Moscow,Russia +79862451427
6916 15 Lin Jonathan Tammy 1948-02-19 7998 692107 1980-11-02 Smith 67809605761 College Moscow,Russia Moscow,Russia +79862451427
7138 34 Rowe Veronica Rachel 2011-10-11 3806 985024 1956-01-14 Adams 80497237448 College Moscow,Russia Moscow,Russia +79862451427
7415 25 Roach Kathy Adam 1909-04-15 9958 161510 1955-07-12 Browna 41966891142 University Moscow,Russia Moscow,Russia +79862451427
3171 14 Gates Brian Heather 1945-03-26 4286 981708 1957-02-10 Myers-Fuentes 16902406110 University Moscow,Russia Moscow,Russia +79862451427
8367 37 Phillips Kristina Erik 1929-07-19 8668 745842 2008-04-30 Anderson 89852425904 University Moscow,Russia Moscow,Russia +79862451427
2610 24 Hamilton Belinda Maria 2003-09-28 7529 424465 1964-04-14 Velasquez 35237801767 College Moscow,Russia Moscow,Russia +79862451427
6768 26 Hamilton Corey Devon 1985-11-04 8542 455879 1921-03-12 Ritter 86023564566 University Moscow,Russia Moscow,Russia +79862451427
9605 53 Green Ashley Paula 1930-02-04 8167 442035 1945-02-12 Baker 47394411324 School Moscow,Russia Moscow,Russia +79862451427

Перейдем к написанию самого скрипта. Пишем цикл, который будет построчно проходится по файлу с тестовыми данными. Далее каждую из строк разбивать на отдельные значения с помощью line.strip().split(' ').

with open('credit_info.txt', 'r') as file:
    for line in file:

        loanAmount, loanPeriod, lastName, firstName, middleName, dob, \
        passportSeries, passportNumber, passportIssueDate, passportIssuedBy, \
        snils, education, registrationAddress, residentialAddress, phone \
        = line.strip().split(' ')

Теперь возьмем код, полученный в результате экспорта из Selenium. Уберем обращение к self. Подставим значения, взятые из текстового файла, вместо тех, что были введены нами вручную.

Например, вместо driver.find_element(By.ID, "loanAmount").send_keys(‘значение, введённое вручную’) должно получиться driver.find_element(By.ID, "loanAmount").send_keys(loanAmount). Фрагмент полученного кода представлен ниже.

driver.find_element(By.ID, "loanAmount").click()
driver.find_element(By.ID, "loanAmount").send_keys(loanAmount)
driver.find_element(By.ID, "loanPeriod").click()
driver.find_element(By.ID, "loanPeriod").send_keys(loanPeriod)

Рассмотрим наш код более подробно. Кроме обращения к элементам страницы и заполнения значений в коде прописана логика для работы с браузером.

В строке driver = webdriver.Chrome() открывается браузер Chrome для работы с ним через написанную программу. В строке driver.get("http://127.0.0.1:5000/createcase") прописан адрес страницы, с которой мы начинаем тестирование. Функция driver.set_window_size(834, 661) необходима для установки размера экрана и не является обязательной в нашем случае. В конце скрипта есть строка driver.quit(), которая закрывает браузер и требуется в скрипте, как и driver = webdriver.Chrome(). Фрагмент кода из данных строк ниже.

driver = webdriver.Chrome()

driver.get("http://127.0.0.1:5000/createcase")
driver.set_window_size(834, 661)
driver.quit()

В результате у нас получается готовый для тестирования скрипт. В начале мы экспортируем необходимые модули из библиотеки Selenium. Далее выполняем все действия описанные выше. Итоговый код представлен ниже.

from selenium import webdriver
from selenium.webdriver.common.by import By

with open('credit_info.txt', 'r') as file:
    for line in file:

        loanAmount, loanPeriod, lastName, firstName, middleName, dob, \
        passportSeries, passportNumber, passportIssueDate, passportIssuedBy, \
        snils, education, registrationAddress, residentialAddress, phone \
        = line.strip().split(' ')

        #часть экспорта из Selenium IDE
        driver = webdriver.Chrome()

        driver.get("http://127.0.0.1:5000/createcase")
        driver.set_window_size(834, 661)
        driver.find_element(By.ID, "creditProgram").click()
        dropdown = driver.find_element(By.ID, "creditProgram")
        dropdown.find_element(By.XPATH, "//option[. = 'Программа 2']").click()
        driver.find_element(By.ID, "loanAmount").click()
        driver.find_element(By.ID, "loanAmount").send_keys(loanAmount)
        driver.find_element(By.ID, "loanPeriod").click()
        driver.find_element(By.ID, "loanPeriod").send_keys(loanPeriod)
        driver.find_element(By.ID, "lastName").click()
        driver.find_element(By.ID, "lastName").send_keys(lastName)
        driver.find_element(By.ID, "firstName").click()
        driver.find_element(By.ID, "firstName").send_keys(firstName)
        driver.find_element(By.ID, "middleName").click()
        driver.find_element(By.ID, "middleName").send_keys(middleName)
        driver.find_element(By.ID, "dob").click()
        driver.find_element(By.ID, "dob").send_keys(dob)
        driver.find_element(By.ID, "passportSeries").click()
        driver.find_element(By.ID, "passportSeries").send_keys(passportSeries)
        driver.find_element(By.ID, "passportNumber").click()
        driver.find_element(By.ID, "passportNumber").send_keys(passportNumber)
        driver.find_element(By.ID, "passportIssueDate").click()
        driver.find_element(By.ID, "passportIssueDate").send_keys(passportIssueDate)
        driver.find_element(By.ID, "passportIssuedBy").click()
        driver.find_element(By.ID, "passportIssuedBy").send_keys(passportIssuedBy)
        driver.find_element(By.CSS_SELECTOR, "form").click()
        driver.find_element(By.ID, "snils").click()
        driver.find_element(By.ID, "snils").send_keys(snils)
        driver.find_element(By.ID, "education").click()
        driver.find_element(By.ID, "education").send_keys(education)
        driver.find_element(By.ID, "registrationAddress").click()
        driver.find_element(By.ID, "registrationAddress").send_keys(registrationAddress)
        driver.find_element(By.ID, "residentialAddress").click()
        driver.find_element(By.ID, "residentialAddress").send_keys(residentialAddress)
        driver.find_element(By.ID, "phone").click()
        driver.find_element(By.ID, "phone").send_keys(phone)
        driver.find_element(By.ID, "agreement").click()
        driver.find_element(By.CSS_SELECTOR, ".button").click()

        driver.quit()

Также затрону тему масштабирования данного решения, которая пересекается с его преимуществами. Так как язык Python является одним из основных языков анализа данных, то описанное решение можно доработать для дополнительных задач. Данные, полученные при тестировании, можно анализировать с использованием различных подходов. С помощью библиотеки Seleniumwire мы можем получить доступ не только к элементам страницы, но также и к API. Данная библиотека поможет нам обрабатывать отправляемые запросы и полученные ответы в результате тестирования страницы. Например, в случае с кредитной заявкой это может запрос создания заявки или запрос получения данных при ее заполнении.

Полученные после обработки запросов данные можно анализировать различными количественными метриками, писать скрипты для обработки или построить графики для визуализации полученных результатов.

В завершении хочется сказать, что внедрение автоматизации и разработки в свою работу открывает множество новых подходов к решению задач. Умение писать код или применять профильные навыки тестирования для системного аналитика в большинстве случаев не являются обязательными. Но погружение в систему, возможность применения новых подходов и умение решать расширенный спектр задач всегда будут вашими преимуществами.

Комментарии (0)