
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']