pyleniumio - wrapper для Selenium + pytest.

Дисклеймер

Хочу поделиться опытом использования одного из немногих удобных Selenium wrapper на #python3 (pytest) - pyleniumio. В этой статье описан пример использования, сравнение с Selenium на python, как запустить тесты через Docker HUB ( так же как и на обычном :slight_smile: selenium + python ).
И да - на сайте вы можете найти почти идентичный материал с тем как все запустить и сконфигурировать. Но если вас заинтересовала статья, то (надеюсь) и по моему туториалу вы тоже сможете попробовать этот враппер.

pyleniumio

Как было сказано несколько раз выше - это wrapper (обертка вокруг) всем нам хорошо знакомого Selenium. И как результат - мы имеем возможность использовать одновременно стандартные методы Selenium + немного кастомизированные pyleniumio.

py.visit('https://google.com.ua')
py.webdriver.find_element_by_class_name()

Python выделяется на фоне конкурентов - своей лаконичностью, #pyleniumio пошел еще дальше - и еще немного уменьшил количество необходимого кода для запуска тестов.

Установка и запуска

Начинаем с создания virtualenv. Сам #pyleniumio должен устанавливаться легко через менеджер пакетов python. На сайте описан метод, который у меня не сработал, как ожидалось, через команду:

pip install pyleniumio

и результатом выполнения должны создаваться несколько файлов - conftest.py + pyleniumio.json - и они у меня не появились, руками создавать нет смысла ( так как они должны создаваться с набором фиксутр для pytest)

Я попробовал метод описанный в видео через команду и все получилось:

pipenv install pyleniumio

Пишем тест

Создаем тест и в него сразу передает fixture py
Это одна из автоматически созданных fixture которые можно найти в файле conftest.py
Fixture - Py который мы передаем в тест, это стандартная реализация driver - которую нужно было писать руками, а в #pyleniumio она идет из коробки, мелочь? да, но приятно :slight_smile:


@pytest.fixture(scope='function')
def py(test_case, py_config, request):
    """ Initialize a Pylenium driver for each test.

    Pass in this `py` fixture into the test function.

    Examples:
        def test_go_to_google(py):
            py.visit('https://google.com')
            assert 'Google' in py.title
    """
    py = Pylenium(py_config, test_case.logger)
    yield py
    if request.node.rep_call.failed:
        # if the test failed, execute code in this block
        if py_config.logging.screenshots_on:
            py.screenshot(f'{test_case.file_path}/test_failed.png')
    py.quit()

Самый простенький тест будет выглядеть как и обычный простенький тест на pytest :slight_smile:

from selenium.webdriver.common.keys import Keys


def test_new_wrapper(py):
    py.visit('https://automated-testing.info')
    py.get('#search-button > svg').click()
    py.get('#search-term').type('pyleniumio', Keys.ENTER)
    assert py.get('div.fps-result > div.fps-topic > div.topic').contains('pyleniumio')

Что сразу заметно - экран максимального размера, не нужно дописывать

driver.maximize_window()

мелочь, но приятно.

В целом очень много кастомных методов которые быстро работают. Можно дописать свои, поддерживаются (как я уже писал) стандартные методы Selenium, это значит что на #pyleniumio можно легко мигрировать.

Docker

И напоследок пример того как запускать тесты в контейнере и как легко работает параллелизация. - и тут будет без новизны, если вы запускали все это на pytest то все будет работать так же.
Добавляем в файл pylenium.json:

{
  "driver": {
    "version": "latest",
    "remote_url": "http://localhost:4444/wd/hub"

  }
}

Создаем docker-compose.yaml

version: "3"
services:

  selenium-hub:
    image: selenium/hub
    ports:
      - "4444:4444"
    environment:
        GRID_MAX_SESSION: 16
        GRID_BROWSER_TIMEOUT: 300
        GRID_TIMEOUT: 300

  chrome:
    image: selenium/node-chrome
    depends_on:
      - selenium-hub
    environment:
      HUB_PORT_4444_TCP_ADDR: selenium-hub
      HUB_PORT_4444_TCP_PORT: 4444
      NODE_MAX_SESSION: 2
      NODE_MAX_INSTANCES: 2

  firefox:
    image: selenium/node-firefox
    depends_on:
      - selenium-hub
    environment:
      HUB_PORT_4444_TCP_ADDR: selenium-hub
      HUB_PORT_4444_TCP_PORT: 4444
      NODE_MAX_SESSION: 4
      NODE_MAX_INSTANCES: 4

Запуск контейнера:

docker-compose up -d

И запуск тестов py.test -v ...

Методы

Весь список реализованных методов - лучше всего смотреть на сайте.
Из того что мне понравилось - это фикстура - fake, в своих тестах использовал.
execute_script - раньше писал этот метод сам)
drag_to_element
и много других :slight_smile:

Выводы

Легкий в настройке, простой и интуитивно понятный в использовании врапер.
Глобально ничего нового, все кто использую Selenium - привыкли максимально кастомизировать под свои требования, добавляют свои фикстуры и методы и в этом нет ничего сложно и плохого, но как приятно с коробки получать больше. И при этом всем - ты все еще так же можешь кастомизировать :slight_smile:
Я бы рекомендовал всем попробовать #pyleniumio. И планирую даже попробовать мигрировать на одном из своих проектов на него.
Думаю что все минусы всплываюь в активном использовании, но то что я уже увидел - подкупает.

P.S. Для #java есть аналог jalenium

Есть желание попробовать pyleniumio?

  • Да
  • Нет

0 участников

3 лайка

А Вы не пробовали Selene? Тоже крутой враппер. В стиле Selenide из мира Java. Не сравнивали с pyleniumio?

2 лайка

Selene не пробовал) с Java у меня не сложилось)

Selene это питон wrapper над selenium. По тем примерам кода что я увидел в этой теме — селен ещё лаконичнее и богаче. Это из опыта. Я пару лет на нем уже делаю тесты

2 лайка

перепутал с selenide :slight_smile: Selene не пробовал, но думаю что попробую)

А почему с java не сложилось?

1 лайк

риторический вопрос) python понравился больше)

Немного не понимаю старание сделать еще более укороченным/удобным синтаксис написания тестов на Selenium + Python. Ладно еще Java, там сам синтаксис раздут и Selenide им наверное как мана небесная. Но Python сам по себе краток, почти все действия типа явных ожиданий в одну строчку. Плюс возьмем тот факт, что почти все проекты реализуют в себе Page Object, так зачем эти обертки, если все равно функционал будет описан в методах страниц? А там внутри - какая разница чистый это Selenium или обертка над ним?

2 лайка

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

2 лайка

пробовал чисто для обкатки старта автоматизации на новом проекте. что бы не писать фикстуры ( хотя обычно они просто копируются с успешного проекта), доп методы. хотел попробовать все это из коробки.

ну вот даже для этой статьи я пробовал pylenium. мне понравилось. но когда решил использовать его на реальном проекте - то сразу пришлось заглядывать под капот и переписывать некоторые методы.

плюс мир не стоит на месте) всегда интересно для себя попробовать что то новое. даже посмотреть как все реализовано под капотом у враппера - для меня позитивный опыт) думаю что пока использовать его я не буду, но некоторые реализованные фикстуры - возьму на вооружение)

Честно говоря, лень выискивать) Не могли бы вы скинуть самые интересные на ваш взгляд фикстуры? Можно просто ссылкой где смотреть.

из коробки идет: webdriver manager, parser.addoption --browser (Chrome, Firefox), Faker, и сам драйвер - py. но сразу добавлю что я пытался мигрировать на него в одном маленьком проекте и у меня возникли небольшие проблемы )

Нету негптивных проверок (аля element.should().ot_be_checked()) + в колекцыях проверок нет тоже.