Универсальная платформа автоматизации браузера:
Веб-сканирование/тестирование/скрапинг/скрытность
Начало | ? Особенности | ?️ Опции | Примеры | ? Скрипты | мобильный
API | ? Форматы | ? Регистратор | Панель управления | ? Локали | Ферма
?️ Графический интерфейс | ? Тестовая страница | ? Режим UC | ? Режим CDP | ? Графики | Сетка
?️ Как | ? Мигрировать | Планы реализации | ♻️ Шаблон | ? Гибрид | ? Туры
? CI/CD | ?️ JSMgr | ? Переводчик | Ведущий | ? Диалог | ?️ Визуальный
SeleniumBase — это профессиональный набор инструментов для веб-автоматизации. Создан для тестирования веб-сайтов, обхода CAPTCHA, повышения производительности, выполнения задач и масштабирования вашего бизнеса.
Изучите более 200 примеров в папке SeleniumBase/examples/ .
? Обратите внимание, что у SeleniumBase UC Mode (Stealth Mode) есть собственный файл ReadMe.
? Также обратите внимание, что режим Seleniumbase CDP имеет собственный отдельный файл ReadMe.
Скрипты можно вызывать через python
, хотя некоторые форматы синтаксиса требуют pytest (инфраструктура модульного тестирования Python, включенная в SeleniumBase, которая может автоматически обнаруживать, собирать и запускать тесты).
? Вот my_first_test.py, который проверяет вход в систему, покупки и оформление заказа:
pytest my_first_test.py
pytest
использует--chrome
по умолчанию, если не указано иное.
? Вот test_coffee_cart.py, который проверяет сайт электронной коммерции:
pytest test_coffee_cart.py --demo
(режим
--demo
замедляет тесты и подсвечивает действия)
? Вот test_demo_site.py, который охватывает несколько действий:
pytest test_demo_site.py
Легко печатать, щелкать, выбирать, переключать, перетаскивать и многое другое.
(Дополнительные примеры см. в папке SeleniumBase/examples/.)
Изучите README:
- Начало работы / Установка
- Базовый пример/использование
- Общие методы испытаний
- Интересные факты / Узнать больше
- Демонстрационный режим/Отладка
- Параметры командной строки
- Конфигурация каталога
- Панель управления SeleniumBase
- Создание отчетов об испытаниях
SeleniumBase — это платформа Python для автоматизации и тестирования браузеров. SeleniumBase использует API-интерфейсы Selenium/WebDriver и включает средства запуска тестов, такие как pytest
, pynose
и behave
чтобы обеспечить организованную структуру, обнаружение тестов, выполнение тестов, состояние теста ( например, пройдено, не удалось или пропущено ) и параметры командной строки для изменения. настройки по умолчанию ( например, выбор браузера ). При использовании сырого Selenium вам потребуется настроить собственный анализатор параметров для настройки тестов из командной строки.
Менеджер драйверов SeleniumBase дает вам больше контроля над автоматической загрузкой драйверов. (Используйте --driver-version=VER
с командой запуска pytest
, чтобы указать версию.) По умолчанию SeleniumBase загрузит версию драйвера, которая соответствует основной версии вашего браузера, если она не установлена.
SeleniumBase автоматически определяет между селекторами CSS и XPath, что означает, что вам не нужно указывать тип селектора в ваших командах ( но при желании вы можете это сделать ).
Методы SeleniumBase часто выполняют несколько действий за один вызов метода. Например, self.type(selector, text)
делает следующее:
1. Ожидает, пока элемент станет видимым.
2. Ожидает, пока элемент станет интерактивным.
3. Очищает текстовое поле.
4. Введите новый текст.
5. Нажимает Enter/Submit, если текст заканчивается на "n"
.
При использовании сырого Selenium эти действия требуют нескольких вызовов методов.
SeleniumBase использует значения таймаута по умолчанию, если они не установлены:
✅ self.click("button")
При использовании сырого Selenium методы мгновенно завершались сбоем ( по умолчанию ), если элементу требовалось больше времени для загрузки:
self.driver.find_element(by="css selector", value="button").click()
(Надежный код лучше ненадежного.)
SeleniumBase позволяет изменять явные значения таймаута методов:
✅ self.click("button", timeout=10)
При использовании сырого Selenium для этого требуется больше кода:
WebDriverWait(driver, 10).until(EC.element_to_be_clickable("css selector", "button")).click()
(Простой код лучше сложного.)
SeleniumBase дает вам чистый вывод ошибок в случае неудачного теста. При использовании сырого Selenium сообщения об ошибках могут быть очень запутанными.
SeleniumBase дает вам возможность создавать панель мониторинга и отчеты для тестов. Он также сохраняет скриншоты неудачных тестов в папке ./latest_logs/
. Raw Selenium не имеет этих опций «из коробки».
SeleniumBase включает настольные приложения с графическим интерфейсом для запуска тестов, такие как SeleniumBase Commander для pytest
и SeleniumBase Behave GUI для behave
.
SeleniumBase имеет собственный рекордер/генератор тестов для создания тестов на основе ручных действий браузера.
SeleniumBase поставляется с программным обеспечением для управления тестовыми сценариями («CasePlans») для организации тестов и описаний шагов.
SeleniumBase включает инструменты для создания приложений с данными («ChartMaker»), которые могут генерировать JavaScript из Python.
Узнайте о различных способах написания тестов:
Вот test_simple_login.py, который использует наследование классов BaseCase
и запускается с помощью pytest или pynose. (Используйте self.driver
для доступа к необработанному driver
Selenium.)
from seleniumbase import BaseCase
BaseCase . main ( __name__ , __file__ )
class TestSimpleLogin ( BaseCase ):
def test_simple_login ( self ):
self . open ( "seleniumbase.io/simple/login" )
self . type ( "#username" , "demo_user" )
self . type ( "#password" , "secret_pass" )
self . click ( 'a:contains("Sign in")' )
self . assert_exact_text ( "Welcome!" , "h1" )
self . assert_element ( "img#image1" )
self . highlight ( "#image1" )
self . click_link ( "Sign out" )
self . assert_text ( "signed out" , "#top_message" )
? Вот тест из sb_fixture_tests.py, в котором используется приспособление sb
pytest
. Запускается с помощью pytest. (Используйте sb.driver
для доступа к необработанному driver
Selenium.)
def test_sb_fixture_with_no_class ( sb ):
sb . open ( "seleniumbase.io/simple/login" )
sb . type ( "#username" , "demo_user" )
sb . type ( "#password" , "secret_pass" )
sb . click ( 'a:contains("Sign in")' )
sb . assert_exact_text ( "Welcome!" , "h1" )
sb . assert_element ( "img#image1" )
sb . highlight ( "#image1" )
sb . click_link ( "Sign out" )
sb . assert_text ( "signed out" , "#top_message" )
? Вот raw_login_sb.py, который использует диспетчер контекста SB
. Работает на чистом python
. (Используйте sb.driver
для доступа к необработанному driver
Selenium.)
from seleniumbase import SB
with SB () as sb :
sb . open ( "seleniumbase.io/simple/login" )
sb . type ( "#username" , "demo_user" )
sb . type ( "#password" , "secret_pass" )
sb . click ( 'a:contains("Sign in")' )
sb . assert_exact_text ( "Welcome!" , "h1" )
sb . assert_element ( "img#image1" )
sb . highlight ( "#image1" )
sb . click_link ( "Sign out" )
sb . assert_text ( "signed out" , "#top_message" )
? Вот raw_login_context.py, который использует диспетчер DriverContext
. Работает на чистом python
. ( driver
представляет собой улучшенную версию необработанного driver
Selenium с большим количеством методов.)
from seleniumbase import DriverContext
with DriverContext () as driver :
driver . open ( "seleniumbase.io/simple/login" )
driver . type ( "#username" , "demo_user" )
driver . type ( "#password" , "secret_pass" )
driver . click ( 'a:contains("Sign in")' )
driver . assert_exact_text ( "Welcome!" , "h1" )
driver . assert_element ( "img#image1" )
driver . highlight ( "#image1" )
driver . click_link ( "Sign out" )
driver . assert_text ( "signed out" , "#top_message" )
? Вот raw_login_driver.py, который использует диспетчер Driver
. Работает на чистом python
. ( driver
представляет собой улучшенную версию необработанного driver
Selenium с большим количеством методов.)
from seleniumbase import Driver
driver = Driver ()
try :
driver . open ( "seleniumbase.io/simple/login" )
driver . type ( "#username" , "demo_user" )
driver . type ( "#password" , "secret_pass" )
driver . click ( 'a:contains("Sign in")' )
driver . assert_exact_text ( "Welcome!" , "h1" )
driver . assert_element ( "img#image1" )
driver . highlight ( "#image1" )
driver . click_link ( "Sign out" )
driver . assert_text ( "signed out" , "#top_message" )
finally :
driver . quit ()
Вот login_app.feature, который использует синтаксис Behavior-BDD Gherkin. Работает с behave
. (Узнайте об интеграции поведения SeleniumBase с BDD )
Feature : SeleniumBase scenarios for the Simple App
Scenario : Verify the Simple App (Login / Logout)
Given Open "seleniumbase.io/simple/login"
And Type "demo_user" into "#username"
And Type "secret_pass" into "#password"
And Click 'a:contains("Sign in")'
And Assert exact text "Welcome!" in "h1"
And Assert element "img#image1"
And Highlight "#image1"
And Click link "Sign out"
And Assert text "signed out" in "#top_message"
? Добавьте Python и Git в свою системную PATH.
? Рекомендуется использовать виртуальную среду Python.
Вы можете установить seleniumbase
из PyPI или GitHub:
? Как установить seleniumbase
из PyPI:
pip install seleniumbase
--upgrade
ИЛИ -U
для обновления SeleniumBase.)--force-reinstall
для обновления косвенных пакетов.)pip3
, если присутствует несколько версий Python.) ? Как установить seleniumbase
из клона GitHub:
git clone https://github.com/seleniumbase/SeleniumBase.git
cd SeleniumBase/
pip install -e .
? Как обновить существующую установку из клона GitHub:
git pull
pip install -e .
? Введите seleniumbase
или sbase
, чтобы убедиться, что SeleniumBase успешно установлен:
___ _ _ ___
/ __ | ___ | | ___ _ _ (_)_ _ _ __ | _ ) __ _ ______
_ _ / -_) / -_) ' | | | | ' | _ / _ ` (_- < -_)
| ___/ _ __ | _ _ __ | _ || _ | _ | _ ,_ | _ | _ | _ | ___/ _ _,_/__ | ___ |
----------------------------------------------------
╭──────────────────────────────────────────────────╮
│ * USAGE: " seleniumbase [COMMAND] [PARAMETERS] " │
│ * OR: " sbase [COMMAND] [PARAMETERS] " │
│ │
│ COMMANDS: PARAMETERS / DESCRIPTIONS: │
│ get / install [DRIVER_NAME] [OPTIONS] │
│ methods (List common Python methods) │
│ options (List common pytest options) │
│ behave-options (List common behave options) │
│ gui / commander [OPTIONAL PATH or TEST FILE] │
│ behave-gui (SBase Commander for Behave) │
│ caseplans [OPTIONAL PATH or TEST FILE] │
│ mkdir [DIRECTORY] [OPTIONS] │
│ mkfile [FILE.py] [OPTIONS] │
│ mkrec / codegen [FILE.py] [OPTIONS] │
│ recorder (Open Recorder Desktop App.) │
│ record (If args: mkrec. Else: App.) │
│ mkpres [FILE.py] [LANG] │
│ mkchart [FILE.py] [LANG] │
│ print [FILE] [OPTIONS] │
│ translate [SB_FILE.py] [LANG] [ACTION] │
│ convert [WEBDRIVER_UNITTEST_FILE.py] │
│ extract-objects [SB_FILE.py] │
│ inject-objects [SB_FILE.py] [OPTIONS] │
│ objectify [SB_FILE.py] [OPTIONS] │
│ revert-objects [SB_FILE.py] [OPTIONS] │
│ encrypt / obfuscate │
│ decrypt / unobfuscate │
│ proxy (Start a basic proxy server) │
│ download server (Get Selenium Grid JAR file) │
│ grid-hub [start | stop] [OPTIONS] │
│ grid-node [start | stop] --hub=[HOST/IP] │
│ │
│ * EXAMPLE = > " sbase get chromedriver stable " │
│ * For command info = > " sbase help [COMMAND] " │
│ * For info on all commands = > " sbase --help " │
╰──────────────────────────────────────────────────╯
✅ SeleniumBase автоматически загружает веб-драйверы по мере необходимости, например chromedriver
.
*** chromedriver to download = 121.0.6167.85 (Latest Stable)
Downloading chromedriver-mac-arm64.zip from:
https://storage.googleapis.com/chrome-for-testing-public/121.0.6167.85/mac-arm64/chromedriver-mac-arm64.zip ...
Download Complete !
Extracting [ ' chromedriver ' ] from chromedriver-mac-arm64.zip ...
Unzip Complete !
The file [chromedriver] was saved to:
/Users/michael/github/SeleniumBase/seleniumbase/drivers/chromedriver
Making [chromedriver 121.0.6167.85] executable ...
[chromedriver 121.0.6167.85] is now ready for use !
? Если вы клонировали SeleniumBase, вы можете запускать тесты из папки example/.
Вот my_first_test.py:
cd examples/
pytest my_first_test.py
Вот код my_first_test.py:
from seleniumbase import BaseCase
BaseCase . main ( __name__ , __file__ )
class MyTestClass ( BaseCase ):
def test_swag_labs ( self ):
self . open ( "https://www.saucedemo.com" )
self . type ( "#user-name" , "standard_user" )
self . type ( "#password" , "secret_sauce n " )
self . assert_element ( "div.inventory_list" )
self . assert_exact_text ( "Products" , "span.title" )
self . click ( 'button[name*="backpack"]' )
self . click ( "#shopping_cart_container a" )
self . assert_exact_text ( "Your Cart" , "span.title" )
self . assert_text ( "Backpack" , "div.cart_item" )
self . click ( "button#checkout" )
self . type ( "#first-name" , "SeleniumBase" )
self . type ( "#last-name" , "Automation" )
self . type ( "#postal-code" , "77123" )
self . click ( "input#continue" )
self . assert_text ( "Checkout: Overview" )
self . assert_text ( "Backpack" , "div.cart_item" )
self . assert_text ( "29.99" , "div.inventory_item_price" )
self . click ( "button#finish" )
self . assert_exact_text ( "Thank you for your order!" , "h2" )
self . assert_element ( 'img[alt="Pony Express"]' )
self . js_click ( "a#logout_sidebar_link" )
self . assert_element ( "div#login_button_container" )
self . open ( url ) # Navigate the browser window to the URL.
self . type ( selector , text ) # Update the field with the text.
self . click ( selector ) # Click the element with the selector.
self . click_link ( link_text ) # Click the link containing text.
self . go_back () # Navigate back to the previous URL.
self . select_option_by_text ( dropdown_selector , option )
self . hover_and_click ( hover_selector , click_selector )
self . drag_and_drop ( drag_selector , drop_selector )
self . get_text ( selector ) # Get the text from the element.
self . get_current_url () # Get the URL of the current page.
self . get_page_source () # Get the HTML of the current page.
self . get_attribute ( selector , attribute ) # Get element attribute.
self . get_title () # Get the title of the current page.
self . switch_to_frame ( frame ) # Switch into the iframe container.
self . switch_to_default_content () # Leave the iframe container.
self . open_new_window () # Open a new window in the same browser.
self . switch_to_window ( window ) # Switch to the browser window.
self . switch_to_default_window () # Switch to the original window.
self . get_new_driver ( OPTIONS ) # Open a new driver with OPTIONS.
self . switch_to_driver ( driver ) # Switch to the browser driver.
self . switch_to_default_driver () # Switch to the original driver.
self . wait_for_element ( selector ) # Wait until element is visible.
self . is_element_visible ( selector ) # Return element visibility.
self . is_text_visible ( text , selector ) # Return text visibility.
self . sleep ( seconds ) # Do nothing for the given amount of time.
self . save_screenshot ( name ) # Save a screenshot in .png format.
self . assert_element ( selector ) # Verify the element is visible.
self . assert_text ( text , selector ) # Verify text in the element.
self . assert_exact_text ( text , selector ) # Verify text is exact.
self . assert_title ( title ) # Verify the title of the web page.
self . assert_downloaded_file ( file ) # Verify file was downloaded.
self . assert_no_404_errors () # Verify there are no broken links.
self . assert_no_js_errors () # Verify there are no JS errors.
? Полный список методов SeleniumBase см. в разделе «Сводка методов».
✅ SeleniumBase автоматически обрабатывает типичные действия WebDriver, такие как запуск веб-браузеров перед тестами, сохранение снимков экрана во время сбоев и закрытие веб-браузеров после тестов.
✅ SeleniumBase позволяет настраивать тесты с помощью параметров командной строки.
✅ SeleniumBase использует простой синтаксис команд. Пример:
self . type ( "input" , "dogs n " ) # (The "n" presses ENTER)
Большинство скриптов SeleniumBase можно запускать с помощью pytest
, pynose
или чистого python
. Не все средства запуска тестов могут запускать все форматы тестов. Например, тесты, использующие приспособление sb
pytest, можно запускать только с помощью pytest
. (См. «Форматы синтаксиса»). Существует также формат теста Gherkin, который работает с поведением.
pytest coffee_cart_tests.py --rs
pytest test_sb_fixture.py --demo
pytest test_suite.py --rs --html=report.html --dashboard
pynose basic_test.py --mobile
pynose test_suite.py --headless --report --show-report
python raw_sb.py
python raw_test_scripts.py
behave realworld.feature
behave calculator.feature -D rs -D dashboard
✅ pytest
включает автоматическое обнаружение тестов. Если вы не укажете конкретный файл или папку для запуска, pytest
автоматически выполнит поиск тестов для запуска во всех подкаталогах на основе следующих критериев:
test_
или заканчиваются _test.py
.test_
. При наличии файла SeleniumBase pytest.ini вы можете изменить настройки обнаружения по умолчанию. Имя класса Python может быть любым, поскольку seleniumbase.BaseCase
наследует unittest.TestCase
для запуска автообнаружения.
✅ Вы можете выполнить предполетную проверку, чтобы увидеть, какие тесты будут обнаружены pytest
перед фактическим запуском:
pytest --co -q
✅ Вы можете быть более конкретным при вызове pytest
или pynose
для файла:
pytest [FILE_NAME.py]::[CLASS_NAME]::[METHOD_NAME]
pynose [FILE_NAME.py]:[CLASS_NAME].[METHOD_NAME]
✅ Больше никаких ненадежных тестов! Методы SeleniumBase автоматически ждут завершения загрузки элементов страницы, прежде чем взаимодействовать с ними ( до ограничения по времени ожидания ). Это означает , что вам больше не нужны случайные time.sleep()
в ваших сценариях.
✅ SeleniumBase поддерживает все основные браузеры и операционные системы:
Браузеры: Chrome, Edge, Firefox и Safari.
Системы: Linux/Ubuntu, macOS и Windows.
✅ SeleniumBase работает на всех популярных платформах CI/CD:
✅ SeleniumBase включает в себя гибридное решение для автоматизации и ручного управления под названием MasterQA, позволяющее ускорить ручное тестирование за счет автоматизации, в то время как ручные тестировщики выполняют проверку.
✅ SeleniumBase поддерживает запуск тестов в автономном режиме ( при условии, что веб-драйверы ранее были загружены в режиме онлайн ).
✅ Чтобы просмотреть полный список функций SeleniumBase, нажмите здесь.
? Демонстрационный режим помогает вам увидеть, что делает тест. Если тест выполняется слишком быстро для ваших глаз, запустите его в демонстрационном режиме , чтобы ненадолго приостановить работу браузера между действиями, выделить элементы страницы, над которыми выполняются действия, и отобразить утверждения:
pytest my_first_test.py --demo
? time.sleep(seconds)
можно использовать для ожидания теста в определенном месте:
import time ; time . sleep ( 3 ) # Do nothing for 3 seconds.
? Режим отладки со встроенной библиотекой Python pdb помогает отлаживать тесты:
import pdb ; pdb . set_trace ()
import pytest ; pytest . set_trace ()
breakpoint () # Shortcut for "import pdb; pdb.set_trace()"
(команды
pdb
:n
,c
,s
,u
,d
=>next
,continue
,step
,up
,down
)
? Чтобы приостановить активный тест, который выдает исключение или ошибку ( и оставить окно браузера открытым, пока в консоли начинается режим отладки ), добавьте --pdb
в качестве параметра pytest
:
pytest test_fail.py --pdb
? Чтобы запустить тесты в режиме отладки, добавьте --trace
в качестве опции pytest
:
pytest test_coffee_cart.py --trace
✅ Вот несколько полезных опций командной строки, которые входят в состав pytest
:
-v # Verbose mode. Prints the full name of each test and shows more details.
-q # Quiet mode. Print fewer details in the console output when running tests.
-x # Stop running the tests after the first failure is reached.
--html=report.html # Creates a detailed pytest-html report after tests finish.
--co | --collect-only # Show what tests would get run. (Without running them)
--co -q # (Both options together!) - Do a dry run with full test names shown.
-n=NUM # Multithread the tests using that many threads. (Speed up test runs!)
-s # See print statements. (Should be on by default with pytest.ini present.)
--junit-xml=report.xml # Creates a junit-xml report after tests finish.
--pdb # If a test fails, enter Post Mortem Debug Mode. (Don't use with CI!)
--trace # Enter Debug Mode at the beginning of each test. (Don't use with CI!)
-m=MARKER # Run tests with the specified pytest marker.
✅ SeleniumBase предоставляет дополнительные параметры командной строки pytest
для тестов:
--browser=BROWSER # (The web browser to use. Default: "chrome".)
--chrome # (Shortcut for "--browser=chrome". On by default.)
--edge # (Shortcut for "--browser=edge".)
--firefox # (Shortcut for "--browser=firefox".)
--safari # (Shortcut for "--browser=safari".)
--settings-file=FILE # (Override default SeleniumBase settings.)
--env=ENV # (Set the test env. Access with "self.env" in tests.)
--account=STR # (Set account. Access with "self.account" in tests.)
--data=STRING # (Extra test data. Access with "self.data" in tests.)
--var1=STRING # (Extra test data. Access with "self.var1" in tests.)
--var2=STRING # (Extra test data. Access with "self.var2" in tests.)
--var3=STRING # (Extra test data. Access with "self.var3" in tests.)
--variables=DICT # (Extra test data. Access with "self.variables".)
--user-data-dir=DIR # (Set the Chrome user data directory to use.)
--protocol=PROTOCOL # (The Selenium Grid protocol: http|https.)
--server=SERVER # (The Selenium Grid server/IP used for tests.)
--port=PORT # (The Selenium Grid port used by the test server.)
--cap-file=FILE # (The web browser's desired capabilities to use.)
--cap-string=STRING # (The web browser's desired capabilities to use.)
--proxy=SERVER:PORT # (Connect to a proxy server:port as tests are running)
--proxy=USERNAME:PASSWORD@SERVER:PORT # (Use an authenticated proxy server)
--proxy-bypass-list=STRING # (";"-separated hosts to bypass, Eg "*.foo.com")
--proxy-pac-url=URL # (Connect to a proxy server using a PAC_URL.pac file.)
--proxy-pac-url=USERNAME:PASSWORD@URL # (Authenticated proxy with PAC URL.)
--proxy-driver # (If a driver download is needed, will use: --proxy=PROXY.)
--multi-proxy # (Allow multiple authenticated proxies when multi-threaded.)
--agent=STRING # (Modify the web browser's User-Agent string.)
--mobile # (Use the mobile device emulator while running tests.)
--metrics=STRING # (Set mobile metrics: "CSSWidth,CSSHeight,PixelRatio".)
--chromium-arg= " ARG=N,ARG2 " # (Set Chromium args, ","-separated, no spaces.)
--firefox-arg= " ARG=N,ARG2 " # (Set Firefox args, comma-separated, no spaces.)
--firefox-pref=SET # (Set a Firefox preference:value set, comma-separated.)
--extension-zip=ZIP # (Load a Chrome Extension .zip|.crx, comma-separated.)
--extension-dir=DIR # (Load a Chrome Extension directory, comma-separated.)
--disable-features= " F1,F2 " # (Disable features, comma-separated, no spaces.)
--binary-location=PATH # (Set path of the Chromium browser binary to use.)
--driver-version=VER # (Set the chromedriver or uc_driver version to use.)
--sjw # (Skip JS Waits for readyState to be "complete" or Angular to load.)
--wfa # (Wait for AngularJS to be done loading after specific web actions.)
--pls=PLS # (Set pageLoadStrategy on Chrome: "normal", "eager", or "none".)
--headless # (The default headless mode. Linux uses this mode by default.)
--headless1 # (Use Chrome's old headless mode. Fast, but has limitations.)
--headless2 # (Use Chrome's new headless mode, which supports extensions.)
--headed # (Run tests in headed/GUI mode on Linux OS, where not default.)
--xvfb # (Run tests using the Xvfb virtual display server on Linux OS.)
--xvfb-metrics=STRING # (Set Xvfb display size on Linux: "Width,Height".)
--locale=LOCALE_CODE # (Set the Language Locale Code for the web browser.)
--interval=SECONDS # (The autoplay interval for presentations & tour steps)
--start-page=URL # (The starting URL for the web browser when tests begin.)
--archive-logs # (Archive existing log files instead of deleting them.)
--archive-downloads # (Archive old downloads instead of deleting them.)
--time-limit=SECONDS # (Safely fail any test that exceeds the time limit.)
--slow # (Slow down the automation. Faster than using Demo Mode.)
--demo # (Slow down and visually see test actions as they occur.)
--demo-sleep=SECONDS # (Set the wait time after Slow & Demo Mode actions.)
--highlights=NUM # (Number of highlight animations for Demo Mode actions.)
--message-duration=SECONDS # (The time length for Messenger alerts.)
--check-js # (Check for JavaScript errors after page loads.)
--ad-block # (Block some types of display ads from loading.)
--host-resolver-rules=RULES # (Set host-resolver-rules, comma-separated.)
--block-images # (Block images from loading during tests.)
--do-not-track # (Indicate to websites that you don't want to be tracked.)
--verify-delay=SECONDS # (The delay before MasterQA verification checks.)
--ee | --esc-end # (Lets the user end the current test via the ESC key.)
--recorder # (Enables the Recorder for turning browser actions into code.)
--rec-behave # (Same as Recorder Mode, but also generates behave-gherkin.)
--rec-sleep # (If the Recorder is enabled, also records self.sleep calls.)
--rec-print # (If the Recorder is enabled, prints output after tests end.)
--disable-cookies # (Disable Cookies on websites. Pages might break!)
--disable-js # (Disable JavaScript on websites. Pages might break!)
--disable-csp # (Disable the Content Security Policy of websites.)
--disable-ws # (Disable Web Security on Chromium-based browsers.)
--enable-ws # (Enable Web Security on Chromium-based browsers.)
--enable-sync # (Enable "Chrome Sync" on websites.)
--uc | --undetected # (Use undetected-chromedriver to evade bot-detection.)
--uc-cdp-events # (Capture CDP events when running in "--undetected" mode.)
--log-cdp # ("goog:loggingPrefs", {"performance": "ALL", "browser": "ALL"})
--remote-debug # (Sync to Chrome Remote Debugger chrome://inspect/#devices)
--ftrace | --final-trace # (Debug Mode after each test. Don't use with CI!)
--dashboard # (Enable the SeleniumBase Dashboard. Saved at: dashboard.html)
--dash-title=STRING # (Set the title shown for the generated dashboard.)
--enable-3d-apis # (Enables WebGL and 3D APIs.)
--swiftshader # (Chrome "--use-gl=angle" / "--use-angle=swiftshader-webgl")
--incognito # (Enable Chrome's Incognito mode.)
--guest # (Enable Chrome's Guest mode.)
--dark # (Enable Chrome's Dark mode.)
--devtools # (Open Chrome's DevTools when the browser opens.)
--rs | --reuse-session # (Reuse browser session for all tests.)
--rcs | --reuse-class-session # (Reuse session for tests in class.)
--crumbs # (Delete all cookies between tests reusing a session.)
--disable-beforeunload # (Disable the "beforeunload" event on Chrome.)
--window-position=X,Y # (Set the browser's starting window position.)
--window-size=WIDTH,HEIGHT # (Set the browser's starting window size.)
--maximize # (Start tests with the browser window maximized.)
--screenshot # (Save a screenshot at the end of each test.)
--no-screenshot # (No screenshots saved unless tests directly ask it.)
--visual-baseline # (Set the visual baseline for Visual/Layout tests.)
--wire # (Use selenium-wire's webdriver for replacing selenium webdriver.)
--external-pdf # (Set Chromium "plugins.always_open_pdf_externally":True.)
--timeout-multiplier=MULTIPLIER # (Multiplies the default timeout values.)
--list-fail-page # (After each failing test, list the URL of the failure.)
(Полный список определений параметров командной строки см. здесь . Подробные примеры параметров командной строки см. в customizing_test_runs.md )
? При неудачном тестировании журналы и снимки экрана последнего запуска теста сохраняются в latest_logs/
. Эти журналы будут перемещены в archived_logs/
если вы добавите --archive_logs в параметры командной строки или установите для ARCHIVE_EXISTING_LOGS
значение True в файле settings.py, в противном случае файлы журналов будут очищены в начале следующего запуска теста. Коллекция test_suite.py
содержит тесты, которые специально проваливаются, чтобы вы могли увидеть, как работает ведение журнала.
cd examples/
pytest test_suite.py --chrome
pytest test_suite.py --firefox
Простой способ переопределить seleniumbase/config/settings.py — использовать собственный файл настроек. Вот параметр командной строки, который можно добавить в тесты: (см. примеры/custom_settings.py) --settings_file=custom_settings.py
(Настройки включают значения таймаута по умолчанию, ключ двухфакторной аутентификации, учетные данные БД, учетные данные S3 и другие важные настройки. используется в тестах.)
? Чтобы передать в тесты дополнительные данные из командной строки, добавьте --data="ANY STRING"
. Внутри ваших тестов вы можете использовать self.data
для доступа к ним.
? При запуске тестов с помощью pytest
вам понадобится копия pytest.ini в ваших корневых папках. При запуске тестов с помощью pynose
вам понадобится копия setup.cfg в ваших корневых папках. Эти файлы определяют детали конфигурации по умолчанию для тестов. Тестовые папки также должны содержать пустой файл инициализации .py, чтобы ваши тестовые файлы могли импортировать другие файлы из этой папки.
? sbase mkdir DIR
создает папку с файлами конфигурации и примерами тестов:
sbase mkdir ui_tests
В этой новой папке будут следующие файлы:
ui_tests/
├── __init__.py
├── my_first_test.py
├── parameterized_test.py
├── pytest.ini
├── requirements.txt
├── setup.cfg
├── test_demo_site.py
└── boilerplates/
├── __init__.py
├── base_test_case.py
├── boilerplate_test.py
├── classic_obj_test.py
├── page_objects.py
├── sb_fixture_test.py
└── samples/
├── __init__.py
├── google_objects.py
├── google_test.py
├── sb_swag_test.py
└── swag_labs_test.py
Совет™: вы также можете создать шаблонную папку без каких-либо примеров тестов, добавив -b
или --basic
к команде sbase mkdir
:
sbase mkdir ui_tests --basic
В этой новой папке будут следующие файлы:
ui_tests/
├── __init__.py
├── pytest.ini
├── requirements.txt
└── setup.cfg
Из этих файлов наиболее важным является файл конфигурации pytest.ini
, за которым следует пустой файл __init__.py
. Также есть файл setup.cfg
(для pynose). Наконец, файл requirements.txt
можно использовать для установки seleniumbase в вашу среду (если он еще не установлен).
Давайте попробуем пример теста, который не прошёл:
""" test_fail.py """
from seleniumbase import BaseCase
BaseCase . main ( __name__ , __file__ )
class MyTestClass ( BaseCase ):
def test_find_army_of_robots_on_xkcd_desert_island ( self ):
self . open ( "https://xkcd.com/731/" )
self . assert_element ( "div#ARMY_OF_ROBOTS" , timeout = 1 ) # This should fail
Вы можете запустить его из папки examples/
следующим образом:
pytest test_fail.py
? Вы заметите, что была создана папка журналов «latest_logs» для хранения информации о неудачном тесте и снимков экрана. Во время тестовых запусков прошлые результаты перемещаются в папку archived_logs, если для ARCHIVE_EXISTING_LOGS установлено значение True в settings.py или если вы запускаете тесты с --archive-logs
. Если вы решите не архивировать существующие журналы, они будут удалены и заменены журналами последнего запуска теста.
? Опция --dashboard
для pytest создает панель мониторинга SeleniumBase, расположенную по адресу dashboard.html
, которая автоматически обновляется по мере запуска тестов и выдает результаты. Пример:
pytest --dashboard --rs --headless
? Кроме того, вы можете разместить свой собственный сервер панели мониторинга SeleniumBase на порту по вашему выбору. Вот пример использования http.server
Python:
python -m http.server 1948
? Теперь вы можете перейти по адресу http://localhost:1948/dashboard.html
чтобы просмотреть панель мониторинга как веб-приложение. Для этого потребуются два разных окна терминала: одно для запуска сервера, а другое — для запуска тестов, которые следует запускать из одного и того же каталога. (Используйте Ctrl+C , чтобы остановить http-сервер.)
? Вот полный пример того, как может выглядеть панель управления SeleniumBase:
pytest test_suite.py test_image_saving.py --dashboard --rs --headless
pytest
: ✅ Использование --html=report.html
дает вам необычный отчет с именем, указанным после завершения вашего набора тестов.
pytest test_suite.py --html=report.html
✅ При объединении HTML-отчетов pytest с использованием SeleniumBase Dashboard круговая диаграмма с Dashboard будет добавлена в HTML-отчет. Кроме того, если вы установите URL-адрес отчета в формате HTML таким же, как URL-адрес информационной панели при использовании информационной панели (пример: --dashboard --html=dashboard.html
), тогда информационная панель станет расширенным отчетом в формате HTML, когда все тесты завершены.
✅ Вот пример обновленного html-отчета:
pytest test_suite.py --dashboard --html=report.html
При просмотре HTML-отчетов pytest в Jenkins вам может потребоваться настроить параметры Jenkins для правильной визуализации HTML. Это связано с изменениями Jenkins CSP.
Вместо этого вы также можете использовать --junit-xml=report.xml
чтобы получить отчет в формате XML. Дженкинс может использовать этот файл для отображения более качественных отчетов по вашим тестам.
pytest test_suite.py --junit-xml=report.xml
pynose
Отчеты: Опция --report
дает вам необычный отчет после завершения вашего набора тестов.
pynose test_suite.py --report
(ПРИМЕЧАНИЕ. Вы можете добавить --show-report
для немедленного отображения отчетов Pynose после завершения набора тестов. Используйте --show-report
только при локальном запуске тестов, поскольку это приостанавливает выполнение теста.)
behave
Панель мониторинга и отчеты:(Папку Bebe_bdd/ можно найти в папке example/.)
behave behave_bdd/features/ -D dashboard -D headless
Вы также можете использовать --junit
для получения отчетов .xml
для каждой функции behave
. Дженкинс может использовать эти файлы для отображения более качественных отчетов по вашим тестам.
behave behave_bdd/features/ --junit -D rs -D headless
См.: https://allurereport.org/docs/pytest/.
SeleniumBase больше не включает allure-pytest
в состав установленных зависимостей. Если вы хотите его использовать, сначала установите его:
pip install allure-pytest
Теперь ваши тесты могут создавать файлы результатов Allure, которые можно обрабатывать с помощью Allure Reports.
pytest test_suite.py --alluredir=allure_results
Если вы хотите использовать прокси-сервер для тестов вашего браузера (Chromium или Firefox), вы можете добавить --proxy=IP_ADDRESS:PORT
в качестве аргумента в командной строке.
pytest proxy_test.py --proxy=IP_ADDRESS:PORT
Если прокси-сервер, который вы хотите использовать, требует аутентификации, вы можете сделать следующее (только для Chromium):
pytest proxy_test.py --proxy=USERNAME:PASSWORD@IP_ADDRESS:PORT
SeleniumBase также поддерживает прокси SOCKS4 и SOCKS5:
pytest proxy_test.py --proxy= " socks4://IP_ADDRESS:PORT "
pytest proxy_test.py --proxy= " socks5://IP_ADDRESS:PORT "
Чтобы упростить задачу, вы можете добавить часто используемые прокси-серверы в PROXY_LIST в proxy_list.py, а затем использовать --proxy=KEY_FROM_PROXY_LIST
чтобы использовать IP_ADDRESS:PORT этого ключа.
pytest proxy_test.py --proxy=proxy1
? Если вы хотите изменить User-Agent для тестов вашего браузера (только Chromium и Firefox), вы можете добавить --agent="USER AGENT STRING"
в качестве аргумента в командной строке.
pytest user_agent_test.py --agent= " Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1.7412.EU "
? self.accept_alert()
автоматически ожидает и принимает всплывающие окна с оповещениями. self.dismiss_alert()
автоматически ожидает и отклоняет всплывающие окна с оповещениями. Иногда некоторые методы, такие как self.click(SELECTOR)
могут закрыть всплывающее окно самостоятельно, поскольку они вызывают JavaScript, чтобы убедиться, что readyState
страницы complete
, прежде чем двигаться дальше. Если вы пытаетесь принять всплывающее окно, которое было закрыто таким образом, используйте этот обходной путь: вместо этого вызовите self.find_element(SELECTOR).click()
(что позволит всплывающему окну оставаться на экране), а затем используйте self.accept_alert()
, чтобы принять всплывающее окно (подробнее об этом здесь). Если всплывающие окна появляются прерывисто, заключите код в блок try/Exception.
? Узнайте об интерактивных пошаговых руководствах SeleniumBase (в папке examples/tour_examples/
). Это отлично подходит для создания прототипа опыта регистрации на веб-сайте.
--with-s3-logging
в командную строку при запуске тестов.Вот пример запуска тестов с включенными некоторыми дополнительными функциями:
pytest [YOUR_TEST_FILE.py] --with-db-reporting --with-s3-logging
? Переход на веб-страницу: (и связанные команды)
self . open ( "https://xkcd.com/378/" ) # This method opens the specified page.
self . go_back () # This method navigates the browser to the previous page.
self . go_forward () # This method navigates the browser forward in history.
self . refresh_page () # This method reloads the current page.
self . get_current_url () # This method returns the current page URL.
self . get_page_source () # This method returns the current page source.
Совет™: вы можете использовать метод self.get_page_source()
с командой Python find()
для анализа HTML и поиска чего-то конкретного. (Более сложный анализ см. в примере BeautifulSoup.)
source = self . get_page_source ()
head_open_tag = source . find ( '<head>' )
head_close_tag = source . find ( '</head>' , head_open_tag )
everything_inside_head = source [ head_open_tag + len ( '<head>' ): head_close_tag ]
? Щелчок:
Чтобы щелкнуть элемент на странице:
self . click ( "div#my_id" )
ProTip™: В большинстве веб-браузеров вы можете щелкнуть страницу правой кнопкой мыши и выбрать Inspect Element
, чтобы просмотреть сведения о селекторе CSS, которые вам понадобятся для создания собственных сценариев.
? Ввод текста:
self.type(selector, text)
# обновляет текст указанного элемента указанным значением. Исключение возникает, если элемент отсутствует или текстовое поле недоступно для редактирования. Пример:
self . type ( "input#id_value" , "2012" )
Вы также можете использовать команду self.add_text()
или WebDriver .send_keys()
, но они не будут сначала очищать текстовое поле, если внутри уже есть текст.
? Получение текста из элемента на странице:
text = self . get_text ( "header h2" )
? Получение значения атрибута из элемента на странице:
attribute = self . get_attribute ( "#comic img" , "title" )
? Утверждение существования элемента на странице в течение некоторого количества секунд:
self . wait_for_element_present ( "div.my_class" , timeout = 10 )
(ПРИМЕЧАНИЕ. Вы также можете использовать: self.assert_element_present(ELEMENT)
)
? Утверждение видимости элемента на странице в течение некоторого количества секунд:
self . wait_for_element_visible ( "a.my_class" , timeout = 5 )
(ПРИМЕЧАНИЕ. Краткими версиями этого являются self.find_element(ELEMENT)
и self.assert_element(ELEMENT)
. Версия find_element()
возвращает элемент.)
Поскольку строка выше возвращает элемент, вы можете объединить его с .click()
как показано ниже:
self . find_element ( "a.my_class" , timeout = 5 ). click ()
# But you're better off using the following statement, which does the same thing:
self . click ( "a.my_class" ) # DO IT THIS WAY!
ProTip™: вы можете использовать точки для обозначения имен классов (например: div.class_name
) как упрощенной версии div[class="class_name"]
в селекторе CSS.
Вы также можете использовать *=
для поиска любого частичного значения в селекторе CSS, как показано ниже:
self . click ( 'a[name*="partial_name"]' )
? Утверждение видимости текста внутри элемента на странице в течение некоторого количества секунд:
self . assert_text ( "Make it so!" , "div#trek div.picard div.quotes" )
self . assert_text ( "Tea. Earl Grey. Hot." , "div#trek div.picard div.quotes" , timeout = 3 )
(ПРИМЕЧАНИЕ: self.find_text(TEXT, ELEMENT)
и self.wait_for_text(TEXT, ELEMENT)
также делают это. Для обратной совместимости были сохранены старые имена методов, но время ожидания по умолчанию может быть другим.)
? Утверждение чего-либо:
self . assert_true ( var1 == var2 )
self . assert_false ( var1 == var2 )
self . assert_equal ( var1 , var2 )
? Полезные условные операторы: (с творческими примерами)
❓ is_element_visible(selector):
(виден на странице)
if self . is_element_visible ( 'div#warning' ):
print ( "Red Alert: Something bad might be happening!" )
❓ is_element_present(selector):
(присутствует в HTML)
if self . is_element_present ( 'div#top_secret img.tracking_cookie' ):
self . contact_cookie_monster () # Not a real SeleniumBase method
else :
current_url = self . get_current_url ()
self . contact_the_nsa ( url = current_url , message = "Dark Zone Found" ) # Not a real SeleniumBase method
def is_there_a_cloaked_klingon_ship_on_this_page ():
if self . is_element_present ( "div.ships div.klingon" ):
return not self . is_element_visible ( "div.ships div.klingon" )
return False
❓ is_text_visible(text, selector):
(текст, видимый на элементе)
if self . is_text_visible ( "You Shall Not Pass!" , "h1" ):
self . open ( "https://www.youtube.com/watch?v=3xYXUeSmb-Y" )
is_text_visible():
def get_mirror_universe_captain_picard_superbowl_ad ( superbowl_year ):
selector = "div.superbowl_%s div.commercials div.transcript div.picard" % superbowl_year
if self . is_text_visible ( "Yes, it was I who summoned you all here." , selector ):
return "Picard Paramount+ Superbowl Ad 2020"
elif self . is_text_visible ( "Commander, signal the following: Our Network is Secure!" ):
return "Picard Mirror Universe iboss Superbowl Ad 2018"
elif self . is_text_visible ( "For the Love of Marketing and Earl Grey Tea!" , selector ):
return "Picard Mirror Universe HubSpot Superbowl Ad 2015"
elif self . is_text_visible ( "Delivery Drones... Engage" , selector ):
return "Picard Mirror Universe Amazon Superbowl Ad 2015"
elif self . is_text_visible ( "Bing it on Screen!" , selector ):
return "Picard Mirror Universe Microsoft Superbowl Ad 2015"
elif self . is_text_visible ( "OK Glass, Make it So!" , selector ):
return "Picard Mirror Universe Google Superbowl Ad 2015"
elif self . is_text_visible ( "Number One, I've Never Seen Anything Like It." , selector ):
return "Picard Mirror Universe Tesla Superbowl Ad 2015"
elif self . is_text_visible ( "Let us make sure history never forgets the name ... Facebook" , selector ):
return "Picard Mirror Universe Facebook Superbowl Ad 2015"
elif self . is_text_visible ( """With the first link, the chain is forged.
The first speech censored, the first thought forbidden,
the first freedom denied, chains us all irrevocably.""" , selector ):
return "Picard Mirror Universe Wikimedia Superbowl Ad 2015"
else :
raise Exception ( "Reports of my assimilation are greatly exaggerated." )
❓ is_link_text_visible(link_text):
if self . is_link_text_visible ( "Stop! Hammer time!" ):
self . click_link ( "Stop! Hammer time!" )
Если ваш тест открывает новую вкладку/окно, вы можете переключиться на него. (SeleniumBase автоматически переключается на новые вкладки, которые не открываются по about:blank
:.)
self . switch_to_window ( 1 ) # This switches to the new tab (0 is the first one)
? iframe действуют по тому же принципу, что и новые окна: сначала необходимо переключиться на iframe, если вы хотите выполнять в нем действия:
self . switch_to_frame ( "iframe" )
# ... Now perform actions inside the iframe
self . switch_to_parent_frame () # Exit the current iframe
Чтобы выйти из нескольких iframe, используйте self.switch_to_default_content()
. (Если внутри одного iframe, это имеет тот же эффект, что и self.switch_to_parent_frame()
.)
self . switch_to_frame ( 'iframe[name="frame1"]' )
self . switch_to_frame ( 'iframe[name="frame2"]' )
# ... Now perform actions inside the inner iframe
self . switch_to_default_content () # Back to the main page
? Вы также можете использовать контекстный менеджер для действий внутри iframe:
with self . frame_switch ( "iframe" ):
# ... Now perform actions while inside the code block
# You have left the iframe
Это также работает с вложенными iframe:
with self . frame_switch ( 'iframe[name="frame1"]' ):
with self . frame_switch ( 'iframe[name="frame2"]' ):
# ... Now perform actions while inside the code block
# You are now back inside the first iframe
# You have left all the iframes
jQuery — это мощная библиотека JavaScript, которая позволяет выполнять расширенные действия в веб-браузере. Если на веб-странице, на которой вы находитесь, уже загружен jQuery, вы можете немедленно начать выполнение сценариев jQuery. Вы это знаете, потому что веб-страница будет содержать в HTML что-то вроде следующего:
< script src =" https://ajax.googleapis.com/ajax/libs/jquery/3.6.3/jquery.min.js " > </ script >
? Это нормально, если вы хотите использовать jQuery на странице, которая еще не загружена. Для этого сначала выполните следующую команду:
self . activate_jquery ()
self . execute_script ( "jQuery, window.scrollTo(0, 600)" ) # Scrolling the page
self . execute_script ( "jQuery('#annoying-widget').hide()" ) # Hiding elements on a page
self . execute_script ( "jQuery('#hidden-widget').show(0)" ) # Showing hidden elements on a page
self . execute_script ( "jQuery('#annoying-button a').remove()" ) # Removing elements on a page
self . execute_script ( "jQuery('%s').mouseover()" % ( mouse_over_item )) # Mouse-over elements on a page
self . execute_script ( "jQuery('input#the_id').val('my_text')" ) # Fast text input on a page
self . execute_script ( "jQuery('div#dropdown a.link').click()" ) # Click elements on a page
self . execute_script ( "return jQuery('div#amazing')[0].text" ) # Returns the css "text" of the element given
self . execute_script ( "return jQuery('textarea')[2].value" ) # Returns the css "value" of the 3rd textarea element on the page
(Большинство приведенных выше команд можно выполнить напрямую с помощью встроенных методов SeleniumBase.)
❗ На некоторых веб-сайтах действует ограничительная Политика безопасности контента, запрещающая пользователям загружать jQuery и другие внешние библиотеки на свои веб-сайты. Если вам нужно использовать jQuery или другую библиотеку JS на этих веб-сайтах, добавьте --disable-csp
в качестве параметра командной строки pytest
, чтобы загрузить расширение Chromium, которое обходит CSP.
start_page = "https://xkcd.com/465/"
destination_page = "https://github.com/seleniumbase/SeleniumBase"
self . open ( start_page )
referral_link = '''<a class='analytics test' href='%s'>Free-Referral Button!</a>''' % destination_page
self . execute_script ( '''document.body.innerHTML = " %s " ''' % referral_link )
self . click ( "a.analytics" ) # Clicks the generated button
(По многочисленным просьбам этот пример генерации трафика был включен в SeleniumBase с методами self.generate_referral(start_page, end_page)
и self.generate_traffic(start_page, end_page, loops)
.
Допустим, вы хотите проверить несколько разных элементов на веб-странице за один тест, но не хотите, чтобы тест завершился неудачно, пока вы не проверите несколько элементов одновременно, чтобы вам не приходилось перезапускать тест, чтобы найти недостающие элементы. элементы на одной странице. Вот тут-то и приходят на помощь отложенные утверждения. Вот пример:
from seleniumbase import BaseCase
BaseCase . main ( __name__ , __file__ )
class DeferredAssertTests ( BaseCase ):
def test_deferred_asserts ( self ):
self . open ( "https://xkcd.com/993/" )
self . wait_for_element ( "#comic" )
self . deferred_assert_element ( 'img[alt="Brand Identity"]' )
self . deferred_assert_element ( 'img[alt="Rocket Ship"]' ) # Will Fail
self . deferred_assert_element ( "#comicmap" )
self . deferred_assert_text ( "Fake Item" , "ul.comicNav" ) # Will Fail
self . deferred_assert_text ( "Random" , "ul.comicNav" )
self . deferred_assert_element ( 'a[name="Super Fake !!!"]' ) # Will Fail
self . deferred_assert_exact_text ( "Brand Identity" , "#ctitle" )
self . deferred_assert_exact_text ( "Fake Food" , "#comic" ) # Will Fail
self . process_deferred_asserts ()
deferred_assert_element()
и deferred_assert_text()
сохранят все возникающие исключения. Чтобы свести все неудачные отложенные утверждения в одно исключение, обязательно вызовите self.process_deferred_asserts()
в конце вашего тестового метода. Если ваш тест охватывает несколько страниц, вы можете вызвать self.process_deferred_asserts()
перед переходом на новую страницу, чтобы снимок экрана из ваших файлов журналов соответствовал URL-адресу, по которому были сделаны отложенные утверждения.
Если вам нужен доступ к каким-либо командам, которые входят в стандартный WebDriver, вы можете вызвать их напрямую следующим образом:
self . driver . delete_all_cookies ()
capabilities = self . driver . capabilities
self . driver . find_elements ( "partial link text" , "GitHub" )
(Как правило, вам следует использовать версии методов SeleniumBase, если они доступны.)
Вы можете использовать pytest --reruns=NUM
, чтобы повторить неудачные тесты много раз. Добавьте --reruns-delay=SECONDS
чтобы ждать определенное количество секунд между повторными попытками. Пример:
pytest --reruns=1 --reruns-delay=1
Вы можете использовать декоратор @retry_on_exception()
чтобы повторить неудачные методы. (Первый импорт: from seleniumbase import decorators
). Чтобы узнать больше о декораторах SeleniumBase, нажмите здесь.
«Выявляйте ошибки в тестировании перед развертыванием кода в производстве!»