Selenium — это зонтичный проект, объединяющий множество инструментов и библиотек, обеспечивающих автоматизацию веб-браузера. Selenium специально предоставляет инфраструктуру для спецификации W3C WebDriver — независимый от платформы и языка интерфейс кодирования, совместимый со всеми основными веб-браузерами.
Проект стал возможен благодаря добровольцам, которые щедро пожертвовали тысячи часов на разработку и поддержку кода.
Исходный код Selenium доступен по лицензии Apache 2.0.
Этот README предназначен для разработчиков, заинтересованных в участии в проекте. Людям, которые хотят начать использовать Selenium, ознакомьтесь с подробными примерами и описаниями в нашем Руководстве пользователя, а если вы застряли, есть несколько способов получить помощь.
Пожалуйста, прочтите CONTRIBUTING.md, прежде чем отправлять запросы на включение.
Это требования для создания собственной локальной среды разработки для разработки Selenium.
Bazelisk — оболочка Bazel, которая автоматически загружает версию Bazel, указанную в файле .bazelversion
, и прозрачно передает все аргументы командной строки в настоящий двоичный файл Bazel.
Java JDK версии 17 или выше (например, Java 17 Temurin)
Установите для переменной среды JAVA_HOME
расположение исполняемого файла Java (JDK, а не JRE).
Чтобы проверить это, попробуйте запустить команду javac
. Эта команда не будет существовать, если у вас установлена только JRE. Если вы видите список параметров командной строки, вы правильно ссылаетесь на JDK.
Xcode, включая инструменты командной строки. Установите последнюю версию, используя: xcode-select --install
Rosetta для компьютеров Apple Silicon Mac. Добавьте build --host_platform=//:rosetta
в файл .bazelrc.local
. Мы работаем над тем, чтобы в долгосрочной перспективе это не потребовалось.
Несколько лет назад Джим Эванс опубликовал замечательную статью о настройке среды разработки Windows для языковых привязок Selenium .NET; Эта статья устарела, но содержит более подробные описания и снимки экрана, которые могут оказаться полезными для некоторых людей.
Этот скрипт обеспечит полную готовность к работе среды разработчика. (ничего не установлено и не установлено из того, что уже присутствует, если не предложено иное)
Откройте Powershell от имени администратора.
Выполнить: Set-ExecutionPolicy Bypass -Scope Process -Force
, чтобы разрешить запуск сценария в процессе.
Перейдите в каталог, в который вы хотите клонировать Selenium, или в родительский каталог уже клонированного репозитория Selenium.
Загрузите и выполните этот скрипт в терминале PowerShell: [scripts/dev-environment-setup.ps1]`
Разрешить запуск скриптов в Selenium в целом:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
Включить режим разработчика:
reg add "HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionAppModelUnlock" /t REG_DWORD /f /v "AllowDevelopmentWithoutDevLicense" /d "1"
Установите MSYS2, альтернативную среду оболочки, предоставляющую команды типа Unix.
Добавьте каталог bin в переменную среды PATH
(например, "C:toolsmsys64usrbin"
)
Добавьте местоположение bash.exe
в качестве переменной среды BAZEL_SH
(например, "C:toolsmsys64usrbinbash.exe"
).
Установите последнюю версию сообщества Visual Studio.
Используйте установщик Visual Studio, чтобы изменить и добавить рабочую нагрузку «Разработка настольных компьютеров на C++».
Добавьте местоположение каталога установки инструментов сборки Visual C++ в переменную среды BAZEL_VC
(например, "C:Program FilesMicrosoft Visual Studio2022CommunityVC"
).
Добавьте версию инструментов сборки Visual C++ в переменную среды BAZEL_VC_FULL_VERSION
(это можно узнать по имени каталога в "$BAZEL_VCToolsMSVC<BAZEL_VC_FULL_VERSION>"
)
Добавить поддержку длинных имен файлов (Bazel имеет множество вложенных каталогов, которые могут превышать ограничения по умолчанию в Windows).
reg добавить "HKEY_LOCAL_MACHINESOFTWAREMicrosoftCommand Processor" /t REG_DWORD /f /v "DisableUNCCheck" /d "1"reg добавить "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlFileSystem" /t REG_DWORD /f /v "LongPathsEnabled" /d "1"
Создайте файл selenium/.bazelrc.windows.local
Добавьте в файл «startup --output_user_root=C:/tmp».
Разрешить Bazel создавать версии с короткими именами для длинных путей к файлам: fsutil 8dot3name set 0
Установите вывод bazel в C:/tmp
вместо вложенного в каталог проекта:
Включите поддержку длинных путей с помощью этих двух команд реестра:
Если вы хотите внести свой вклад в проект, но не хотите создавать собственную локальную среду разработки, есть две альтернативы.
Вместо создания собственной локальной среды разработки GitPod предоставляет вам готовую к использованию среду.
В качестве альтернативы вы можете создать Dev-контейнер (по сути, Docker-контейнер), подходящий для сборки и тестирования Selenium, используя devcontainer.json в каталоге .devcontainer. Поддержка таких IDE, как VS Code или IntelliJ IDEA, должна указать вам, как можно создать такой контейнер.
Вы также можете создать образ Docker, подходящий для сборки и тестирования Selenium, используя файл Dockerfile в каталоге образа dev.
Selenium создан с использованием общего инструмента сборки под названием Bazel, который позволяет нам легко управлять загрузкой зависимостей, генерировать необходимые двоичные файлы, собирать и выпускать пакеты, а также выполнять тесты; все быстро и эффективно. Для более подробного обсуждения прочитайте статью Саймона Стюарта о создании Selenium.
Часто мы оборачиваем команды Bazel нашей специальной оболочкой Rake. Они запускаются с помощью команды ./go
.
Общие команды Bazel:
bazel build
— оценивает зависимости, компилирует исходные файлы и генерирует выходные файлы для указанной цели. Он используется для создания исполняемых двоичных файлов, библиотек и других артефактов.
bazel run
— строит цель и затем выполняет ее. Обычно он используется для целей, которые создают исполняемые двоичные файлы.
bazel test
— собирает и запускает цель в контексте с дополнительными функциями тестирования.
bazel query
— определяет доступные цели для указанного пути.
Каждый модуль, который можно построить, определен в файле BUILD.bazel
. Чтобы выполнить модуль, вы ссылаетесь на него, начиная с //
, затем включаете относительный путь к файлу, который его определяет, затем :
, а затем имя цели. Например, цель для построения Grid называется executable-grid
и определяется в файле 'selenium/java/src/org/openqa/selenium/grid/BAZEL.build'
. Итак, чтобы построить сетку, вы должны запустить: bazel build //java/src/org/openqa/selenium/grid:executable-grid
.
В документации Bazel есть удобное руководство по различным сочетаниям клавиш и всем способам создания нескольких целей, которые Selenium часто использует.
Чтобы построить все для данного языка:
сборка bazel //<язык>/...
Чтобы построить только сетку, нужно использовать псевдоним (в журнале будет показано, где находится выходной jar):
Базельская сетка построения
Чтобы упростить задачу, сборку каждой привязки можно выполнить с помощью команды ./go
./go <язык>:build
Большая часть команды использует Intellij для повседневного редактирования. Если вы работаете в IntelliJ, мы настоятельно рекомендуем установить плагин Bazel IJ, который описан на его собственном сайте.
Чтобы использовать Selenium с плагином IntelliJ Bazel, импортируйте репозиторий как проект Bazel и выберите файл представления проекта из каталога сценариев. ij.bazelproject
для Mac/Linux и ij-win.bazelproject
для Windows.
Мы также используем формат Google Java для линтинга, поэтому полезно использовать плагин Google Java Formatter; Чтобы заставить его работать, нужно выполнить несколько шагов, поэтому прочтите их документацию по конфигурации. Существует также сценарий автоматического форматирования, который можно запустить: ./scripts/format.sh
Хотя Selenium не собирается с помощью Maven, вы можете собрать и установить части Selenium для локального использования Maven, развернув их в локальном репозитории maven ( ~/.m2/repository
), используя:
./go Java:установить
Зависимости определяются в файле maven_deps.bzl. Чтобы автоматически обновить и закрепить новые зависимости, запустите:
./go java:обновить
Вы можете запускать код Python локально, обновляя сгенерированные файлы в каталоге Python, используя:
./go py:обновить
Чтобы установить Selenium локально на основе определенного коммита, вы можете использовать:
./go py:установить
Вместо использования irb
вы можете создать интерактивный REPL со всеми загруженными драгоценными камнями, используя: bazel run //rb:console
Если вы хотите отладить код, вы можете сделать это с помощью debug
камня:
Добавьте binding.break
в код, в котором вы хотите, чтобы запускался отладчик.
Запустите тесты с конфигурацией ruby_debug
: bazel test --config ruby_debug <test>
.
Когда отладчик запустится, запустите следующую команду в отдельном терминале для подключения к отладчику:
базель-селен/внешний/пакет/bin/rdbg -A
Если вы хотите использовать RubyMine для разработки, вы можете настроить его на использование артефактов Bazel:
Откройте rb/
как основной каталог проекта.
При необходимости запустите bundle exec rake update
для создания актуальных артефактов. Если это не сработает, запустите ./go rb:update
из каталога selenium
(родительского).
В настройках/Языки и платформы/Ruby SDK и Gems добавьте новый интерпретатор , указывающий на ../bazel-selenium/external/rules_ruby_dist/dist/bin/ruby
.
Теперь вы сможете запускать и отлаживать любую спецификацию. По умолчанию он использует Chrome, но вы можете изменить его, используя переменные среды, указанные в разделе «Тестирование Ruby» ниже.
Чтобы синхронизировать Carbo.Bazel.lock
с Cargo.lock
, запустите:
CARGO_BAZEL_REPIN=настоящая синхронизация с базэлом --only=ящики
Существует ряд конфигураций Bazel, специально предназначенных для тестирования.
Вот примеры аргументов, которые мы используем при тестировании кода Selenium:
--pin_browsers
— запускать определенные версии браузера, определенные в сборке (версии регулярно обновляются)
--headless
— запускать браузеры в безголовом режиме (поддерживается Chrome, Edge и Firefox)
--flaky_test_attempts 3
— перезапуск неудачных тестов до 3 раз
--local_test_jobs 1
— контролировать параллелизм тестов
--cache_test_results=no
, -t-
— отключить кэширование результатов тестов и перезапустить их все
--test_output all
— вывести весь вывод тестов, а не только ошибки
--test_output streamed
— запускать все тесты один за другим и немедленно распечатывать результаты
--test_env FOO=bar
— передать дополнительную переменную среды для тестирования процесса
--run_under="xvfb-run -a"
— префикс для вставки перед выполнением
Тесты Selenium можно фильтровать по размеру:
маленький — обычно модульные тесты, в которых браузер не открывается
большой — обычно тесты, которые на самом деле управляют браузером
средний — тесты, которые более сложны, чем простые модульные тесты, но не полностью управляют браузером.
Их можно отфильтровать с помощью аргумента test_size_filters
следующим образом:
базельский тест //<язык>/... --test_size_filters=small
Тесты также можно фильтровать по тегам, например:
bazel test //<язык>/... --test_tag_filters=this,-not-this
Чтобы запустить модульные тесты:
базельский тест //java/... --test_size_filters=small
Чтобы запустить интеграционные тесты:
базельский тест //java/... --test_size_filters=medium
Чтобы запустить тесты браузера:
bazel test //java/... --test_size_filters=large --test_tag_filters=<браузер>
Чтобы запустить конкретный тест:
Базельский тест //java/test/org/openqa/selenium/chrome:ChromeDriverFunctionalTest
Для запуска тестов выполните:
Базельский тест //javascript/node/selenium-webdriver:tests
Вы можете использовать --test_env
для передачи имени браузера как SELENIUM_BROWSER
.
тест bazel //javascript/node/selenium-webdriver:tests --test_env=SELENIUM_BROWSER=firefox
Запустите модульные тесты с помощью:
Базельский тест //py:unit
Чтобы запустить тесты в конкретном браузере:
тест bazel //py:test-<имя браузера>
Чтобы запустить все тесты Python:
Базельский тест //py:all
Цели тестирования:
Команда | Описание |
---|---|
bazel test //rb/... | Запустите модуль, все интеграционные тесты и проверку. |
bazel test //rb:lint | Запускаем линтер RuboCop |
bazel test //rb/spec/... | Запускайте модульные и интеграционные тесты для всех браузеров. |
bazel test //rb/spec/... --test_size_filters small | Запускайте модульные тесты |
bazel test //rb/spec/unit/... | Запускайте модульные тесты |
bazel test //rb/spec/... --test_size_filters large | Запустите интеграционные тесты для всех браузеров |
bazel test //rb/spec/integration/... | Запустите интеграционные тесты для всех браузеров |
bazel test //rb/spec/integration/... --test_tag_filters firefox | Запускайте интеграционные тесты только для локального Firefox. |
bazel test //rb/spec/integration/... --test_tag_filters firefox-remote | Запускайте интеграционные тесты только для удаленного Firefox. |
bazel test //rb/spec/integration/... --test_tag_filters firefox,firefox-remote | Запустите интеграционные тесты для локального и удаленного Firefox. |
Целевые тесты Ruby имеют то же имя, что и файл спецификации, но удален _spec.rb
, поэтому вы можете запускать их по отдельности. Цели интеграционных тестов также имеют браузер и удаленный суффикс, позволяющий контролировать, какой браузер выбрать и использовать ли Grid.
Тестовый файл | Тестовая цель |
---|---|
rb/spec/unit/selenium/webdriver/proxy_spec.rb | //rb/spec/unit/selenium/webdriver:proxy |
rb/spec/integration/selenium/webdriver/driver_spec.rb | //rb/spec/integration/selenium/webdriver:driver-chrome |
rb/spec/integration/selenium/webdriver/driver_spec.rb | //rb/spec/integration/selenium/webdriver:driver-chrome-remote |
rb/spec/integration/selenium/webdriver/driver_spec.rb | //rb/spec/integration/selenium/webdriver:driver-firefox |
rb/spec/integration/selenium/webdriver/driver_spec.rb | //rb/spec/integration/selenium/webdriver:driver-firefox-remote |
Поддерживаемые браузеры:
chrome
edge
firefox
firefox-beta
ie
safari
safari-preview
В дополнение к примерам общих параметров, вот несколько дополнительных, специфичных для Ruby:
--test_arg "-eTimeouts"
— тестировать только спецификации, имя которых включает "Timeouts"
--test_arg "<any other RSpec argument>"
— передать любые дополнительные аргументы RSpec (см. bazel run @bundle//bin:rspec -- --help
)
Поддерживаемые переменные среды для использования с --test_env
:
WD_SPEC_DRIVER
— тестируемый драйвер; либо имя браузера, либо «удаленный» (устанавливается Bazel)
WD_REMOTE_BROWSER
— когда WD_SPEC_DRIVER
remote
; имя тестируемого браузера (устанавливается Bazel)
WD_REMOTE_URL
— URL-адрес уже работающего сервера, который будет использоваться для удаленных тестов.
DOWNLOAD_SERVER
— когда WD_REMOTE_URL
не установлен; загружать и использовать самую последнюю выпущенную версию сервера для удаленных тестов
DEBUG
— включает подробную отладку.
HEADLESS
- для хрома, эджа и фаерфокса; запускает тесты в безголовом режиме
DISABLE_BUILD_CHECK
— для хрома и края; игнорировать ли несоответствие версий драйвера и браузера (позволяет тестировать сборки Canary)
CHROME_BINARY
— путь для проверки конкретного браузера Chrome.
CHROMEDRIVER_BINARY
— путь для проверки определенного ChromeDriver.
EDGE_BINARY
— путь для тестирования конкретного браузера Edge.
MSEDGEDRIVER_BINARY
— путь для проверки конкретного драйвера msedgedriver.
FIREFOX_BINARY
— путь для тестирования конкретного браузера Firefox.
GECKODRIVER_BINARY
— путь для проверки конкретного GeckoDriver
Чтобы запустить определенную версию Ruby, вы можете изменить версию в rb/.ruby-version
или из командной строки:
echo '<XYZ>' > rb/.ruby-версия
Тесты .NET в настоящее время работают только с закрепленными браузерами, поэтому обязательно включите это.
Запустите все тесты с помощью:
Базельский тест //dotnet/test/common:AllTests --pin_browsers=true
Вы можете запустить определенные тесты, указав имя класса:
Базельский тест //dotnet/test/common:ElementFindingTest --pin_browsers=true
Если модуль поддерживает несколько браузеров:
Базельский тест //dotnet/test/common:ElementFindingTest-edge --pin_browsers=true
Тесты на ржавчину выполняются с помощью:
базель тест //ржавчина/...
По умолчанию Bazel запускает эти тесты в вашем текущем пользовательском интерфейсе X-сервера. Если вы предпочитаете, вы также можете запустить их на виртуальном или вложенном X-сервере.
Запустите X-сервер Xvfb :99
или Xnest :99
Запустите оконный менеджер, например DISPLAY=:99 jwm
Запустите интересующие вас тесты:
bazel test --test_env=DISPLAY=:99 //java/... --test_tag_filters=chrome
Простой способ запуска тестов на виртуальном X-сервере — использовать функциональность Bazel --run_under
:
bazel test --run_under="xvfb-run -a" //java/...
Документацию по API можно найти здесь:
С#
JavaScript
Ява
Питон
Руби
Чтобы обновить документацию API для определенного языка: ./go <language>:docs
Чтобы обновить всю документацию: ./go all:docs
Обратите внимание, что генерация JavaScript в настоящее время не работает.
Полный процесс создания релиза можно найти в вики.
Выпуск представляет собой сочетание сборки и публикации, что часто требует координации нескольких исполнений и дополнительной обработки. Как обсуждалось в разделе «Создание», для этих целей мы используем задачи Rake с командой ./go
. Эти команды ./go
включают аргумент --stamp
для предоставления необходимой информации о созданном ресурсе.
Вы можете собрать и выпустить все с помощью:
./идти все:отпустить
Чтобы создать и выпустить определенный язык:
./go <язык>:релиз
Если у вас есть доступ к репозиторию Selenium EngFlow, вы можете создавать ресурсы удаленно и загружать локально, используя:
./go all:release['--config', 'release']