Рубрики
Без рубрики

Как я научился тестировать Интернет с селенами -базой

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

Цель: у меня есть простая, амбициозная большая волосатая цель Узнайте, как «автоматизировать все (тестовые) вещи, в Python». Это часть 1 в моем путешествии к этой цели.

Для контекста я считаю себя опытным тестером, но относительным новичком в качестве разработчика. Я участвовал в одном успешном проекте автоматизации, используя PowerShell, и один неудачный проект автоматизации с использованием .NET .NET Структура и селен.

Иди изучить питон! Где-нибудь еще

В этой серии я не буду затрагивать, как установить или использовать основы Python. Это хорошо покрыто земля, и документы Python – отличное место для начала, если это то, что вы после. https://docs.python.org/3/

Seleniumbase

SeleniumBase – это тестовая структура, которая завершает селен и расширяет Pytest, а также работает с тестированием носа. Я выбрал Seleniumbase в качестве своей веб -тестовой структуры, после краткой оценки по нескольким причинам:

  • Низкий барьер для входа, это действительно легко написать и запустить первый тест
  • Конкурс, где в основном базируется в JavaScript (webdriver.io и Nightwatch.js), я обнаружил, что они ловкими, чтобы выбежать из коробки
  • Я хотел избежать Java, для личных предпочтений * Содействующий очень отзывчив через проблемы Twitter и GIT и помог мне и добавил функциональность. Я не могу уделять особое внимание, насколько это дает мне уверенность.
  • Наконец, и, возможно, самое главное, я был в нескольких минутах от того, чтобы выбрать другое направление, и получил рекомендацию от добрых людей из Министерства тестирования тестировщиков. CHAT Slack Community, чтобы использовать Python и Seleniumbase, чтобы начать мое путешествие по автоматизации, в 100 раз спасибо!

Я обнаружил, что вставать и работать с SeleniumBase легко, следуя их собственным инструкциям, поэтому я не собираюсь покрывать эту землю. http://seleniumbase.com/

Интернет

Конечно, я мог и пытался создать некоторую автоматизацию против клиентских проектов. Но вот где я сталкиваюсь с некоторыми проблемами с точки зрения развития своих навыков:

  1. Я не могу поделиться подробностями этой работы с другими, моей природой это конфиденциально
  2. Я ограничен решением проблем для данного проекта
  3. Вещи меняются, поэтому я узнал, что я узнал о сохранении ссылок на элементы страницы

Решение? Интернет! Нет, не этот интернет. http://the-internet.herokuapp.com Анкет

Легко, верно?

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

Следуйте, на GitHub

Если вы хотите следовать за мной в моем путешествии, не стесняйтесь проверить мой репозиторий GitHub: https://github.com/dowenb/seleniumbase-example/tree/master/the_internet Анкет

Примеры до сих пор

На момент написания статьи я прошел автоматизацию тестов против 3 примеров в Интернете. Давайте поближе посмотрим на каждого. Как и в некоторой степени, моя работа содержится в двух файлах:

  • Интернет -объекты (модель объекта страницы)
  • Интернет -тест (тесты, запустить в Pytest)

Помощник _url (путь) функция

def _url(path, prefix='http://'):
    base_url = 'the-internet.herokuapp.com'
    return prefix + base_url + path

Использование этой вспомогательной функции позволяет мне управлять своим базовым URL в одном месте. Вероятно, это немного более сложно, но вы поймете, почему я сделал это в первом примере ниже, Basic Auth.

Основная аут

#the_internet_objects.py
class BasicAuth(object):
    url = _url('/basic_auth', prefix='http://admin:admin@')
    success_text = '#content > div > p'

Основная проблема, которую я должен был решить для этого примера, заключается в том, как передать имя пользователя и пароль для Basic Auth. Я понимаю, что метод, который я выбрал, далеко от производства. Если я окажусь в ситуации, когда я тестирую код предварительного производства, который использует базовую аудиторию, счастливые дни.

#the_internet_test.py
from seleniumbase import BaseCase
from the_internet_objects import BasicAuth, BrokenImages, CheckBoxes

class MyTestClass(BaseCase):

    def test_basic_auth(self):
        self.open(BasicAuth.url)
        self.assert_text(
            'Congratulations! You must have the proper credentials.',
            BasicAuth.success_text
            )

Обратите внимание на класс, унаследовавший от базового, самостоятельного и самостоятельного. Это селенбаза в действии. Для получения более подробной информации о базовой функциональности SeleniumBase, прочитайте примеры в документах: https://github.com/seleniumbase/SeleniumBase/tree/master/examples

Один из них, если вы не назовите определение теста «test_thing», Pytest не найдет его.

Сломанные изображения

#the_internet_objects.py
class BrokenImages(object):
    url = _url('/broken_images')
    image1 = '#content > div > img:nth-child(2)'
    image2 = '#content > div > img:nth-child(3)'
    image3 = '#content > div > img:nth-child(4)'

Я снова использую шаблон модели объекта страницы. После примеров Seleniumbase все, что я делаю, – это хранение строк, которые являются селекторами для элементов, которые я найду в своих тестах. Я не возвращаю объекты здесь, но я абстрагирую локаторы, поэтому у меня есть «единственный источник истины» для обновления, когда обновляется веб -приложение, которое я тестирую, и мои ссылки ломаются.

#the_internet_test.py
from seleniumbase import BaseCase
from the_internet_objects import BasicAuth, BrokenImages, CheckBoxes

class MyTestClass(BaseCase):
    def test_broken_images(self):
        self.open(BrokenImages.url)
        self.assertGreater(int(self.get_attribute(BrokenImages.image1, 'naturalWidth')), 0)
        self.assertGreater(int(self.get_attribute(BrokenImages.image2, 'naturalWidth')), 0)
        self.assertGreater(int(self.get_attribute(BrokenImages.image3, 'naturalWidth')), 0)

Это был мой первый эксперимент с использованием функции get_attributes. Я адаптировал этот метод из эквивалента, который я нашел исследование вызова в Интернете. Получение естественной ширины 0, казалось, было широко распространенным методом, чтобы утверждать, если изображение сломано. Обратите внимание, что это неудачный тест, и этого следует ожидать, что два изображения сломаны, и я утверждаю, что они не должны быть.

Я могу вспомнить как минимум две вещи, которые я не сделал, чтобы сделать этот пример элегантным:

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

Не стесняйтесь присылать мне запрос на привлечение, если вы найдете время, чтобы сделать любое из этих улучшений, или нарастайте мои примеры и сделайте это для себя. В любом случае, дайте мне знать!

Флажки

#the_internet_objects.py
class CheckBoxes(object):
    url = _url('/checkboxes')
    checkbox1 = '#checkboxes > input[type="checkbox"]:nth-child(1)'
    checkbox2 = '#checkboxes > input[type="checkbox"]:nth-child(3)'

Здесь ничего интересного, просто еще одна основная объектная модель. Единственная Gotcha – это то, что флажок 2 – третий ребенок, а не 2 -й. Я считаю, что это потому, что 2 -й ребенок является текстовой меткой для флажки 1. Ответы на открытке.

#the_internet_test.py
from seleniumbase import BaseCase
from the_internet_objects import BasicAuth, BrokenImages, CheckBoxes

class MyTestClass(BaseCase):

    def isChecked(self, checkBox):
        try:
            self.get_attribute(checkBox, 'checked')
            return True
        except:
            return False

    def test_checkboxes(self):
        self.open(CheckBoxes.url)
        #checkbox1 should default unchecked, and a click should leave it checked
        self.assert_false(self.isChecked(CheckBoxes.checkbox1), 'Checkbox1 should be unchecked')
        self.click(CheckBoxes.checkbox1)
        self.assert_true(self.isChecked(CheckBoxes.checkbox1), 'Checkbox1 should be unchecked')
         #checkbox2 should default checked, and a click should leave it unchecked
        self.assert_true(self.isChecked(CheckBoxes.checkbox2), 'Checkbox2 should be checked')
        self.click(CheckBoxes.checkbox2)
        self.assert_false(self.isChecked(CheckBoxes.checkbox2), 'Checkbox2 should be unchecked')

В отличие от примера разбитых изображений, здесь я создал вспомогательный метод. Я использую .get_attribute (), на этот раз мне нужно обойти тот факт, что метод подает пример, если атрибут не найден. Оказывается, атрибут «проверенный» добавляется и удаляется из элемента при проверке и неконтролируемой.

Если вы думаете, если что -то более интересное, я могу проверить с флажками или снова способ более элегантно итерации, дайте мне знать!

Спасибо

Большое спасибо ребятам из Seleniumbase, которых можно найти в Twitter https://twitter.com/seleniumbase Еще один большой крик ребятам из Министерства тестирования https://www.ministryoftesting.com Для вдохновляющего сообщества и отличной коллекции ресурсов. И, наконец, спасибо Дэйву Хаффнеру, http://davehaeffner.com/ В Для Интернета https://github.com/tourdeve/the-internet

Первоначально опубликовано в моем личном блоге по адресу: https://www.dowen.me.uk/how-i-am-learning-to-test-the-internet-with-seleniumbase/

Оригинал: “https://dev.to/dowenb/how-i-am-learning-to-test-the-internet-with-seleniumbase-32”