Селена - это краткая и мощная библиотека для написания тестов пользовательского интерфейса браузера в Python. Он был построен как Pythonic Port популярного проекта Selenide из мира Java. Селена помогает разработчикам писать читаемые и обездоленные тесты, которые «говорят» на общем английском языке, что облегчает их понимание и обмена между командами.
Основной силой Селена является его ориентированный на пользователя API, который абстрагирует сложность работы с Selenium Webdriver. Тесты могут быть написаны с использованием простых, выразительных синтаксисов и функций поддержки, таких как элементы с ленивым оцениваемым, автоматические механизмы повторения для более умного неявного ожидания Ajax-подобной загрузки. При встроенной поддержке PageObject она обеспечивает возможность повторного использования веб-элементов через виджеты.
By.* PageObjects .ActionChains .Селена в настоящее время поддерживает две основные версии:
Последняя рекомендуемая версия перед выпуском (v2.0.0rc9) :
3.8+>=4.12.0Стабильная версия (v1.0.2) :
2.7, 3.5, 3.6, 3.7<4.0.0Для миграции с V1.x в V2.x следуйте руководству по миграции.
От 1.0.2 до 2.0.0rc<LATEST> :
2.0.0rc<LATEST>collection.first() от .first() на .firsttext('foo') используйте be.* Или have.* СинтаксисПримеры потенциального рефакторирования во время миграции:
(text('foo')) to (have.text('foo'))(visible) к (be.visible).should(x, timeout=y) к .with_(timeout=y).should(x).should_not(be.*) .should(be.*.not_) .should(be.not_.*).should_not(have.*) .should(have.no.*) .should(have.*.not_).should_each(condition) .should(condition.each)from selene import be, have Требуется Python 3.8+.
Учитывая Pyenv, установлен, установить необходимую версию Python проста:
$ pyenv install 3.8.13
$ pyenv global 3.8.13
$ python -V
Python 3.8.13Убедитесь, что поэзия и pyenv установлены, тогда:
poetry new my-tests-with-selene
cd my-tests-with-selene
pyenv local 3.8.13
poetry add selene --allow-prereleases # for pre-release version
poetry installДля предварительной версии (рекомендуется для новых проектов):
pip install selene --preДля последней стабильной версии:
pip install seleneЕсли вы предпочитаете устанавливать Selene непосредственно из исходного кода:
git clone https://github.com/yashaka/selene.git
cd selene
python setup.py installИли используя поэзию:
poetry add git+https://github.com/yashaka/selene.gitИли используя PIP:
pip install git+https://github.com/yashaka/selene.gitАвтоматизируйте простой поиск в Google, используя Selene:
from selene import browser , be , have
browser . open ( 'https://google.com/ncr' )
browser . element ( '[name=q]' ). should ( be . blank )
. type ( 'selenium' ). press_enter ()
browser . all ( '#rso>div' ). should ( have . size_greater_than ( 5 ))
. first . should ( have . text ( 'Selenium automates browsers' ))
# not mandatory, because will be closed automatically:
# browser.quit() Selene предоставляет интуитивно понятный API для взаимодействия с веб -элементами, используя такие модули, как be , have by .
Ленивые и динамичные элементы: элементы селена ленивы и динамичны, что означает, что они расположены каждый раз, когда выполняется действие. Это обеспечивает взаимодействие с самым современным элементом.
Вот базовое взаимодействие элемента:
from selene import browser , by , be
# because elements are "lazy",
# you can store them in variable:
search_box = browser . element ( by . name ( 'q' ))
# – even before the actual page will be loaded:
browser . open ( 'https://google.com/ncr' )
search_box . should ( be . blank ). type ( 'Selenium' ). press_enter ()Выбор правильных локаторов элемента имеет решающее значение для надежных испытаний. Вот несколько советов:
Осмотрите элемент: щелкните правой кнопкой мыши на веб-элементе и выберите осмотреть, чтобы просмотреть его HTML в инструментах разработчика браузера.
Используйте уникальные атрибуты: ищите уникальные атрибуты, такие как идентификатор, имя или пользовательские атрибуты для использования в ваших селекторах. Лучшая практика заключается в том, чтобы вести переговоры с разработчиками с использованием уникальных атрибутов data-* специально для тестирования потребностей, таких как data-test-id .
Построить селекторы CSS или XPath: построить селекторы, которые уникально идентифицируют элементы. Например, используя Congiser CSS-Selectors #elementId , .className или [name="q"] или использование xPath для вещей, которые CSS не может обрабатывать: //*[text()="Submit"]/.. Селена автоматически обнаружит, предоставите ли вы селектор CSS или XPath.
Используйте помощников селектора Selene (необязательно): если вам нужна большая часть читаемой на человеке код, вы можете использовать by.name('q') , by.text('Submit') и другие by.* Помощники. Обратите внимание, что кто -то предпочел бы необработанный селектор CSS, как [name=q] Over by.name('q') для принципа поцелуя.
Разбейте длинные селекторы на более мелкие части для лучшей читаемости и обслуживаемости: если найти элемент, у вас есть комплексный селектор, подобный: browser.element('//*[@role="row" and contains(.,"Jon")]//*[@data-field="select-row"]') browser.all('[role=row]').element_by(have.text('Jon')).element('[data-field=select-row]') облегчит понимание и поддержание, потому что если что-то изменится в структуре страницы, и ваш тест не пройдет, вы точно увидите, где он не сведет неудачу в «разложенных частях», в то время как в случае, что вы не сбои, что вы не сработаете, что в том случае, в том случае, в случае, что вы можете увидеть Selcemer, вы не сможете, что вы можете увидеть, что в целом в том случае, что вы не сработаете, что вы не сможете, что выезжает в длине. Следующее необходимо дважды проверить каждую потенциальную причину отказа.
Создайте стратегию пользовательского селектора (необязательно): представьте, что ваши разработчики Frontend следуют передовым методам и используйте атрибуты data-test-id для всех элементов, которые необходимо освещать в тестах, и существует последовательно соглашение о том, чтобы такой элемент был Snake_case_or-Kebab-Case-Words. С Selene's browser.config.selector_to_by_strategy Option вы можете определить стратегию пользовательского селектора для автоматического обнаружения всех таких "snake_kebab-words" проходящих в качестве селекторов и преобразовать их в [data-test-id="snake_kebab-words"] . Тогда пример, такой как browser.all('[data-testid=result]').first.element('[data-testid=result-title-a]').click() может быть упрощен в browser.all('result').first.element('result-title-a').click() Посмотрите, как упростить поиск с помощью тестовых идентификаторов? Руководство для получения более подробной информации.
❗ Эта функция будет доступна в следующем выпуске Selene.️
Селена может автоматически управлять драйвером браузера для вас, но вы можете настроить его, если это необходимо.
from selene import browser
browser . config . base_url = 'https://google.com'
browser . config . timeout = 2
browser . open ( '/ncr' ) from selenium import webdriver
from selene import browser
options = webdriver . ChromeOptions ()
options . add_argument ( '--headless' )
# Add other options as needed
# Selene will automatically detect the browser type (Chrome, Firefox, etc.)
# based on the options passed
browser . config . driver_options = options
browser . config . driver_remote_url = 'http://localhost:4444/wd/hub'
browser . config . base_url = 'https://google.com'
browser . config . timeout = 2
browser . open ( '/ncr' ) from selenium import webdriver
from selene import browser
options = webdriver . ChromeOptions ()
options . add_argument ( '--headless' )
# Add other options as needed
browser . config . driver = webdriver . Remote (
command_executor = 'http://localhost:4444/wd/hub' ,
options = options
)
browser . config . base_url = 'https://google.com'
browser . config . timeout = 2
browser . open ( '/ncr' )Используйте читаемые и стабильные селекторы: стремиться к уникальным, выразительным, выразительным и минимально связанным со структурой DOM, чтобы сделать ваши тесты более подготовленными.
Инкапсулируйте многократные компоненты: используйте модель объекта страницы, чтобы инкапсулировать элементы и действия, способствуя повторному использованию кода.
Использует встроенное ожидание: Селена автоматически ждет, пока элементы будут в желаемом состоянии, снижая необходимость явного ожидания.
Исследуйте API: погрузитесь в исходный код или документацию Селена, чтобы лучше понять доступные методы и конфигурации.
Мы приветствуем вклад в Селену! Вот как вы можете принять участие:
Для получения более подробной информации обратитесь к нашему руководству по взносу.
Смотрите The ChangeLog для получения более подробной информации о недавних обновлениях.