Selenium은 웹 브라우저 자동화를 가능하게 하는 다양한 도구와 라이브러리를 캡슐화하는 포괄적인 프로젝트입니다. Selenium은 특히 모든 주요 웹 브라우저와 호환되는 플랫폼 및 언어 중립적 코딩 인터페이스인 W3C WebDriver 사양을 위한 인프라를 제공합니다.
이 프로젝트는 코드 개발 및 유지에 수천 시간을 아낌없이 기부한 자원 봉사자들에 의해 가능해졌습니다.
Selenium의 소스 코드는 Apache 2.0 라이센스에 따라 제공됩니다.
이 README는 프로젝트에 기여하는 데 관심이 있는 개발자를 위한 것입니다. Selenium 사용을 시작하려는 사람들은 사용자 설명서에서 자세한 예시와 설명을 확인하세요. 막히면 도움을 받을 수 있는 여러 가지 방법이 있습니다.
풀 요청을 제출하기 전에 CONTRIBUTING.md를 읽어보세요.
이는 Selenium에 기여하기 위해 자체 로컬 개발 환경을 만들기 위한 요구 사항입니다.
Bazelisk는 .bazelversion
파일에 지정된 Bazel 버전을 자동으로 다운로드하고 모든 명령줄 인수를 실제 Bazel 바이너리에 투명하게 전달하는 Bazel 래퍼입니다.
Java JDK 버전 17 이상(예: Java 17 Temurin)
JAVA_HOME
환경 변수를 Java 실행 파일의 위치로 설정합니다(JRE가 아닌 JDK).
이를 테스트하려면 javac
명령을 실행해 보십시오. JRE만 설치되어 있는 경우에는 이 명령이 존재하지 않습니다. 명령줄 옵션 목록이 표시되면 JDK를 올바르게 참조하고 있는 것입니다.
명령줄 도구를 포함한 Xcode. xcode-select --install
사용하여 최신 버전을 설치하십시오.
Apple Silicon Mac용 Rosetta. .bazelrc.local
파일에 build --host_platform=//:rosetta
추가합니다. 우리는 장기적으로 이것이 필요하지 않도록 노력하고 있습니다.
몇 년 전 Jim Evans는 Selenium .NET 언어 바인딩을 위한 Windows 개발 환경 설정에 대한 훌륭한 기사를 발표했습니다. 이 문서는 오래되었지만 일부 사람들에게 유용할 수 있는 더 자세한 설명과 스크린샷이 포함되어 있습니다.
이 스크립트는 개발자 환경을 실행할 수 있는 완벽한 준비를 보장합니다. (별도의 메시지가 표시되지 않는 한 이미 존재하는 항목은 설치되거나 설정되지 않습니다.)
관리자로 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"
Unix와 같은 명령을 제공하는 대체 셸 환경인 MSYS2를 설치합니다.
PATH
환경 변수에 bin 디렉터리를 추가합니다(예: "C:toolsmsys64usrbin"
).
bash.exe
위치를 BAZEL_SH
환경 변수로 추가합니다(예: "C:toolsmsys64usrbinbash.exe"
).
최신 버전의 Visual Studio Community 설치
Visual Studio 설치 프로그램을 사용하여 "C++를 사용한 데스크톱 개발" 워크로드 수정 및 추가
BAZEL_VC
환경 변수에 Visual C++ 빌드 도구 설치 디렉터리 위치를 추가합니다(예: "C:Program FilesMicrosoft Visual Studio2022CommunityVC"
).
BAZEL_VC_FULL_VERSION
환경 변수에 Visual C++ 빌드 도구 버전을 추가합니다( "$BAZEL_VCToolsMSVC
의 디렉터리 이름에서 확인할 수 있음).
긴 파일 이름에 대한 지원 추가(bazel에는 Windows의 기본 제한을 초과할 수 있는 많은 중첩 디렉터리가 있음)
reg add "HKEY_LOCAL_MACHINESOFTWAREMicrosoftCommand Processor" /t REG_DWORD /f /v "DisableUNCCheck" /d "1"reg add "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는 자체 로컬 개발 환경을 만드는 대신 즉시 사용할 수 있는 환경을 제공합니다.
대안으로 .devcontainer 디렉터리의 devcontainer.json을 사용하여 Selenium을 빌드하고 테스트하는 데 적합한 Dev 컨테이너(기본적으로 docker 컨테이너)를 빌드할 수 있습니다. VS Code 또는 IntelliJ IDEA와 같은 IDE를 지원하면 그러한 컨테이너를 만드는 방법을 알려줄 것입니다.
dev 이미지 디렉터리에 있는 Dockerfile을 사용하여 Selenium 빌드 및 테스트에 적합한 Docker 이미지를 빌드할 수도 있습니다.
Selenium은 Bazel이라는 일반적인 빌드 도구를 사용하여 빌드되어 종속성 다운로드를 쉽게 관리하고, 필요한 바이너리를 생성하고, 패키지를 빌드 및 릴리스하고, 테스트를 실행할 수 있습니다. 모두 빠르고 효율적으로. 더 자세한 논의를 보려면 Selenium 구축에 관한 Simon Stewart의 기사를 읽어보세요.
종종 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 <언어>:빌드
대부분의 팀은 일상적인 편집에 Intellij를 사용합니다. IntelliJ에서 작업하는 경우 자체 사이트에 문서화되어 있는 Bazel IJ 플러그인을 설치하는 것이 좋습니다.
IntelliJ Bazel 플러그인과 함께 Selenium을 사용하려면 저장소를 Bazel 프로젝트로 가져오고 스크립트 디렉터리에서 프로젝트 보기 파일을 선택합니다. Mac/Linux용 ij.bazelproject
및 Windows용 ij-win.bazelproject
.
우리는 또한 Linting을 위해 Google Java 형식을 사용하므로 Google Java Formatter Plugin을 사용하는 것이 유용합니다. 작동하려면 몇 가지 단계가 있으므로 해당 구성 문서를 읽어보세요. 실행할 수 있는 자동 서식 지정 스크립트도 있습니다: ./scripts/format.sh
Selenium은 Maven으로 빌드되지 않지만 다음을 사용하여 로컬 Maven 저장소( ~/.m2/repository
)에 배포하여 Maven용 Selenium 조각을 빌드하고 설치하여 로컬로 사용할 수 있습니다.
./go 자바:설치
종속성은 maven_deps.bzl 파일에 정의되어 있습니다. 새 종속성을 자동으로 업데이트하고 고정하려면 다음을 실행하세요.
./go java:업데이트
다음을 사용하여 Python 디렉터리에서 생성된 파일을 업데이트하여 Python 코드를 로컬로 실행할 수 있습니다.
./go py:업데이트
특정 커밋을 기반으로 Selenium을 로컬로 설치하려면 다음을 사용할 수 있습니다.
./go py:설치
irb
사용하는 대신 다음을 사용하여 모든 gem이 로드된 대화형 REPL을 생성할 수 있습니다: bazel run //rb:console
코드를 디버깅하려면 debug
gem을 통해 수행할 수 있습니다.
디버거를 시작하려는 코드에 binding.break
추가합니다.
ruby_debug
구성으로 테스트를 실행하세요: bazel test --config ruby_debug
.
디버거가 시작되면 별도의 터미널에서 다음을 실행하여 디버거에 연결합니다.
bazel-셀레늄/외부/번들/bin/rdbg -A
개발에 RubyMine을 사용하려는 경우 Bazel 아티팩트를 사용하여 구성할 수 있습니다.
rb/
기본 프로젝트 디렉터리로 엽니다.
최신 아티팩트를 생성하려면 필요에 따라 bundle exec rake update
실행하세요. 그래도 작동하지 않으면 selenium
(상위) 디렉터리에서 ./go rb:update
실행하세요.
설정 / 언어 및 프레임워크 / Ruby SDK 및 Gems 에서 ../bazel-selenium/external/rules_ruby_dist/dist/bin/ruby
를 가리키는 새 인터프리터를 추가합니다.
이제 모든 사양을 실행하고 디버그할 수 있습니다. 기본적으로 Chrome을 사용하지만 아래 Ruby 테스트 섹션에 명시된 환경 변수를 사용하여 변경할 수 있습니다.
Carbo.Bazel.lock
Cargo.lock
과 동기화된 상태로 유지하려면 다음을 실행하세요.
CARGO_BAZEL_REPIN=true bazel 동기화 --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"
- 실행 전에 삽입할 접두사
셀레늄 테스트는 크기별로 필터링할 수 있습니다.
소규모 — 일반적으로 브라우저가 열리지 않는 단위 테스트
대형 — 일반적으로 실제로 브라우저를 구동하는 테스트
중간 — 단순한 단위 테스트보다 더 복잡하지만 브라우저를 완전히 구동하지는 않는 테스트
다음과 같이 test_size_filters
인수를 사용하여 필터링할 수 있습니다.
bazel 테스트 //<언어>/... --test_size_filters=small
테스트는 다음과 같은 태그로 필터링할 수도 있습니다.
bazel 테스트 //<언어>/... --test_tag_filters=this,-not-this
단위 테스트를 실행하려면 다음 안내를 따르세요.
bazel 테스트 //java/... --test_size_filters=small
통합 테스트를 실행하려면 다음 안내를 따르세요.
bazel 테스트 //java/... --test_size_filters=medium
브라우저 테스트를 실행하려면:
bazel 테스트 //java/... --test_size_filters=large --test_tag_filters=
특정 테스트를 실행하려면:
바젤 테스트 //java/test/org/openqa/selenium/chrome:ChromeDriverFunctionalTest
테스트를 실행하려면 다음 안내를 따르세요.
bazel 테스트 //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
가 제거된 spec 파일과 동일한 이름을 가지므로 개별적으로 실행할 수 있습니다. 통합 테스트 대상에는 선택할 브라우저와 그리드 사용 여부를 제어하는 브라우저와 원격 접미사가 있습니다.
테스트 파일 | 테스트 대상 |
---|---|
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 "
- 추가 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 '' > rb/.ruby-version
.NET 테스트는 현재 고정된 브라우저에서만 작동하므로 이를 포함해야 합니다.
다음을 사용하여 모든 테스트를 실행하세요.
Bazel 테스트 //dotnet/test/common:AllTests --pin_browsers=true
클래스 이름을 지정하여 특정 테스트를 실행할 수 있습니다.
베이젤 테스트 //dotnet/test/common:ElementFindingTest --pin_browsers=true
모듈이 여러 브라우저를 지원하는 경우:
bazel 테스트 //dotnet/test/common:ElementFindingTest-edge --pin_browsers=true
Rust 테스트는 다음을 사용하여 실행됩니다.
바젤 테스트 //rust/...
기본적으로 Bazel은 현재 X-server UI에서 이러한 테스트를 실행합니다. 원하는 경우 가상 또는 중첩된 X-서버에서 실행할 수도 있습니다.
X 서버 Xvfb :99
또는 Xnest :99
를 실행합니다.
창 관리자를 실행합니다(예: DISPLAY=:99 jwm
관심 있는 테스트를 실행하세요.
bazel 테스트 --test_env=DISPLAY=:99 //java/... --test_tag_filters=chrome
가상 X 서버에서 테스트를 실행하는 쉬운 방법은 Bazel의 --run_under
기능을 사용하는 것입니다.
bazel test --run_under="xvfb-run -a" //java/...
API 문서는 여기에서 찾을 수 있습니다:
기음#
자바스크립트
자바
파이썬
루비
특정 언어에 대한 API 문서를 업데이트하려면: ./go
모든 문서를 업데이트하려면: ./go all:docs
현재 JavaScript 생성이 중단되었습니다.
릴리스를 수행하는 전체 프로세스는 위키에서 찾을 수 있습니다.
릴리스는 빌드와 게시의 조합으로, 여러 실행과 추가 처리를 조정해야 하는 경우가 많습니다. Building 섹션에서 설명한 대로 이러한 작업을 위해 ./go
명령과 함께 Rake 작업을 사용합니다. 이러한 ./go
명령에는 구성된 자산에 대해 필요한 정보를 제공하기 위한 --stamp
인수가 포함되어 있습니다.
다음을 사용하여 모든 것을 빌드하고 릴리스할 수 있습니다.
./모두 이동:해제
특정 언어를 빌드하고 릴리스하려면 다음을 수행하십시오.
./go <언어>:해제
Selenium EngFlow 저장소에 액세스할 수 있는 경우 다음을 사용하여 자산을 원격으로 구축하고 로컬로 다운로드할 수 있습니다.
./go all:release['--config', 'release']