Selenium adalah proyek payung yang merangkum berbagai alat dan perpustakaan yang memungkinkan otomatisasi browser web. Selenium secara khusus menyediakan infrastruktur untuk spesifikasi W3C WebDriver — sebuah platform dan antarmuka pengkodean netral bahasa yang kompatibel dengan semua browser web utama.
Proyek ini terwujud berkat kontributor sukarelawan yang dengan murah hati menyumbangkan ribuan jam dalam pengembangan dan pemeliharaan kode.
Kode sumber Selenium tersedia di bawah lisensi Apache 2.0.
README ini diperuntukkan bagi pengembang yang tertarik berkontribusi pada proyek ini. Bagi orang yang ingin mulai menggunakan Selenium, silakan lihat Panduan Pengguna kami untuk contoh dan deskripsi terperinci, dan jika Anda mengalami kebuntuan, ada beberapa cara untuk Mendapatkan Bantuan.
Harap baca CONTRIBUTING.md sebelum mengirimkan permintaan penarikan Anda.
Ini adalah persyaratan untuk membuat lingkungan pengembang lokal Anda sendiri untuk berkontribusi pada Selenium.
Bazelisk, pembungkus Bazel yang secara otomatis mengunduh versi Bazel yang ditentukan dalam file .bazelversion
dan secara transparan meneruskan semua argumen baris perintah ke biner Bazel yang sebenarnya.
Java JDK versi 17 atau lebih tinggi (misalnya Java 17 Temurin)
Setel variabel lingkungan JAVA_HOME
ke lokasi Java yang dapat dieksekusi (JDK bukan JRE)
Untuk mengujinya, coba jalankan perintah javac
. Perintah ini tidak akan ada jika Anda hanya menginstal JRE. Jika Anda menemukan daftar opsi baris perintah, Anda mereferensikan JDK dengan benar.
Xcode termasuk alat baris perintah. Instal versi terbaru menggunakan: xcode-select --install
Rosetta untuk Apple Silicon Mac. Tambahkan build --host_platform=//:rosetta
ke file .bazelrc.local
. Kami berupaya memastikan hal ini tidak diperlukan dalam jangka panjang.
Beberapa tahun yang lalu Jim Evans menerbitkan artikel bagus tentang Menyiapkan Lingkungan Pengembangan Windows untuk Selenium .NET Language Bindings; Artikel ini sudah ketinggalan zaman, tetapi berisi deskripsi dan tangkapan layar yang lebih detail yang mungkin berguna bagi sebagian orang.
Skrip ini akan memastikan lingkungan pengembang siap dieksekusi secara lengkap. (tidak ada yang diinstal atau disetel yang sudah ada kecuali diminta lain)
Buka Powershell sebagai Administrator
Jalankan: Set-ExecutionPolicy Bypass -Scope Process -Force
untuk mengizinkan menjalankan skrip dalam proses
Navigasikan ke direktori tempat Anda ingin mengkloning Selenium, atau direktori induk dari repo Selenium yang sudah dikloning
Unduh dan jalankan skrip ini di terminal PowerShell: [scripts/dev-environment-setup.ps1]`
Izinkan menjalankan skrip di Selenium secara umum:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
Aktifkan Mode Pengembang:
reg add "HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionAppModelUnlock" /t REG_DWORD /f /v "AllowDevelopmentWithoutDevLicense" /d "1"
Instal MSYS2, yang merupakan lingkungan shell alternatif yang menyediakan perintah mirip Unix
Tambahkan direktori bin ke variabel lingkungan PATH
(misalnya, "C:toolsmsys64usrbin"
)
Tambahkan lokasi bash.exe
sebagai variabel lingkungan BAZEL_SH
(misalnya, "C:toolsmsys64usrbinbash.exe"
)
Instal Komunitas Visual Studio versi terbaru
Gunakan penginstal visual studio untuk memodifikasi dan menambahkan Beban Kerja "Pengembangan desktop dengan C++".
Tambahkan lokasi direktori instalasi alat pembangunan Visual C++ ke variabel lingkungan BAZEL_VC
(misalnya "C:Program FilesMicrosoft Visual Studio2022CommunityVC"
)
Tambahkan versi alat Visual C++ Build ke variabel lingkungan BAZEL_VC_FULL_VERSION
(ini dapat ditemukan dari nama direktori di "$BAZEL_VCToolsMSVC
)
Tambahkan dukungan untuk nama file yang panjang (bazel memiliki banyak direktori bersarang yang dapat melebihi batas default di Windows)
reg tambahkan "HKEY_LOCAL_MACHINESOFTWAREMicrosoftCommand Processor" /t REG_DWORD /f /v "DisableUNCCheck" /d "1"reg tambahkan "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlFileSystem" /t REG_DWORD /f /v "LongPathsEnabled" /d "1"
Buat file selenium/.bazelrc.windows.local
Tambahkan "startup --output_user_root=C:/tmp" ke file
Izinkan Bazel membuat versi nama pendek dari jalur file panjang: fsutil 8dot3name set 0
Setel keluaran bazel ke C:/tmp
alih-alih bersarang di dalam direktori proyek:
Aktifkan dukungan Long Paths dengan 2 perintah registri berikut:
Jika Anda ingin berkontribusi pada proyek, namun tidak ingin menyiapkan lingkungan pengembang lokal Anda sendiri, ada dua alternatif yang tersedia.
Daripada membuat lingkungan pengembang lokal Anda sendiri, GitPod menyediakan lingkungan siap pakai untuk Anda.
Sebagai alternatif, Anda dapat membuat Dev Container - pada dasarnya adalah container buruh pelabuhan - cocok untuk membuat dan menguji Selenium menggunakan devcontainer.json di direktori .devcontainer. IDE pendukung seperti VS Code atau IntelliJ IDEA akan mengarahkan Anda tentang bagaimana container tersebut dapat dibuat.
Anda juga dapat membuat image Docker yang cocok untuk membuat dan menguji Selenium menggunakan Dockerfile di direktori image dev.
Selenium dibangun menggunakan alat pembangunan umum yang disebut Bazel, untuk memungkinkan kita mengelola unduhan ketergantungan dengan mudah, menghasilkan biner yang diperlukan, membangun dan merilis paket, dan menjalankan pengujian; semuanya dengan cara yang cepat dan efisien. Untuk pembahasan lebih detail, baca artikel Simon Stewart tentang Membangun Selenium
Seringkali kami membungkus perintah Bazel dengan pembungkus Rake khusus kami. Ini dijalankan dengan perintah ./go
.
Perintah Bazel yang umum adalah:
bazel build
— mengevaluasi dependensi, mengkompilasi file sumber dan menghasilkan file output untuk target yang ditentukan. Ini digunakan untuk membuat binari, perpustakaan, atau artefak lainnya yang dapat dieksekusi.
bazel run
— membangun target dan kemudian mengeksekusinya. Ini biasanya digunakan untuk target yang menghasilkan biner yang dapat dieksekusi.
bazel test
— membangun dan menjalankan target dalam konteks dengan fungsionalitas pengujian tambahan
bazel query
— mengidentifikasi target yang tersedia untuk jalur yang disediakan.
Setiap modul yang dapat dibangun didefinisikan dalam file BUILD.bazel
. Untuk menjalankan modul, Anda merujuknya dimulai dengan //
, lalu sertakan jalur relatif ke file yang mendefinisikannya, lalu :
, lalu nama target. Misalnya, target untuk membangun Grid diberi nama executable-grid
dan didefinisikan dalam file 'selenium/java/src/org/openqa/selenium/grid/BAZEL.build'
. Jadi untuk membangun grid Anda akan menjalankan: bazel build //java/src/org/openqa/selenium/grid:executable-grid
.
Dokumentasi Bazel memiliki panduan praktis untuk berbagai pintasan dan semua cara untuk membangun banyak target, yang sering digunakan Selenium.
Untuk membangun segalanya untuk bahasa tertentu:
pembuatan bazel ///...
Untuk membangun grid saja, ada nama alias yang digunakan (log akan menunjukkan di mana toples keluaran berada):
jaringan pembuatan bazel
Untuk mempermudahnya, membuat setiap binding tersedia dengan perintah ./go
ini
./go:build
Sebagian besar tim menggunakan Intellij untuk pengeditan sehari-hari. Jika Anda bekerja di IntelliJ, kami sangat menyarankan untuk menginstal plugin Bazel IJ yang didokumentasikan di situsnya sendiri.
Untuk menggunakan Selenium dengan plugin IntelliJ Bazel, impor repositori sebagai proyek Bazel, dan pilih file tampilan proyek dari direktori skrip. ij.bazelproject
untuk Mac/Linux dan ij-win.bazelproject
untuk Windows.
Kami juga menggunakan Google Java Format untuk linting, jadi penggunaan Plugin Google Java Formatter berguna; ada beberapa langkah untuk membuatnya berfungsi, jadi bacalah dokumentasi konfigurasinya. Ada juga skrip pemformatan otomatis yang dapat dijalankan: ./scripts/format.sh
Meskipun Selenium tidak dibuat dengan Maven, Anda dapat membuat dan menginstal potongan Selenium untuk digunakan Maven secara lokal dengan menyebarkan ke repositori maven lokal Anda ( ~/.m2/repository
), menggunakan:
./go java:instal
Dependensi didefinisikan dalam file maven_deps.bzl. Untuk memperbarui dan menyematkan dependensi baru secara otomatis, jalankan:
./go java:perbarui
Anda dapat menjalankan kode Python secara lokal dengan memperbarui file yang dihasilkan di direktori python menggunakan:
./go py:perbarui
Untuk menginstal Selenium secara lokal berdasarkan komit tertentu, Anda dapat menggunakan:
./go py:instal
Daripada menggunakan irb
, Anda dapat membuat REPL interaktif dengan semua permata dimuat menggunakan: bazel run //rb:console
Jika Anda ingin men-debug kode, Anda dapat melakukannya melalui debug
gem:
Tambahkan binding.break
ke kode tempat Anda ingin memulai debugger.
Jalankan pengujian dengan konfigurasi ruby_debug
: bazel test --config ruby_debug
.
Saat debugger dimulai, jalankan perintah berikut di terminal terpisah untuk terhubung ke debugger:
bazel-selenium/eksternal/bundel/bin/rdbg -A
Jika Anda ingin menggunakan RubyMine untuk pengembangan, Anda dapat mengonfigurasinya menggunakan artefak Bazel:
Buka rb/
sebagai direktori proyek utama.
Jalankan bundle exec rake update
seperlunya untuk membuat artefak terbaru. Jika ini tidak berhasil, jalankan ./go rb:update
dari direktori selenium
(induk).
Di Pengaturan / Bahasa & Kerangka / Ruby SDK dan Permata tambahkan Interpreter baru yang menunjuk ke ../bazel-selenium/external/rules_ruby_dist/dist/bin/ruby
.
Anda sekarang dapat menjalankan dan men-debug spesifikasi apa pun. Ini menggunakan Chrome secara default, tetapi Anda dapat mengubahnya menggunakan variabel lingkungan yang ditentukan di bagian Pengujian Ruby di bawah.
Agar Carbo.Bazel.lock
tetap tersinkronisasi dengan Cargo.lock
, jalankan:
CARGO_BAZEL_REPIN=sinkronisasi bazel yang sebenarnya --hanya=peti
Ada sejumlah konfigurasi bazel khusus untuk pengujian.
Berikut adalah contoh argumen yang kami gunakan dalam menguji kode Selenium:
--pin_browsers
- menjalankan versi browser tertentu yang ditentukan dalam build (versi diperbarui secara berkala)
--headless
- menjalankan browser dalam mode headless (didukung oleh Chrome, Edge dan Firefox)
--flaky_test_attempts 3
- menjalankan kembali pengujian yang gagal hingga 3 kali
--local_test_jobs 1
- mengontrol paralelisme pengujian
--cache_test_results=no
, -t-
- nonaktifkan cache hasil pengujian dan jalankan kembali semuanya
--test_output all
- mencetak semua keluaran dari pengujian, bukan hanya kesalahan
--test_output streamed
- jalankan semua pengujian satu per satu dan segera cetak hasilnya
--test_env FOO=bar
- meneruskan variabel lingkungan tambahan untuk menguji proses
--run_under="xvfb-run -a"
- awalan untuk dimasukkan sebelum eksekusi
Tes selenium dapat difilter berdasarkan ukuran:
kecil — biasanya pengujian unit di mana tidak ada browser yang dibuka
besar — biasanya pengujian yang benar-benar menggerakkan browser
medium — pengujian yang lebih rumit dibandingkan pengujian unit sederhana, namun tidak sepenuhnya menggerakkan browser
Ini dapat difilter menggunakan argumen test_size_filters
seperti ini:
tes bazel ///... --test_size_filters=kecil
Tes juga dapat difilter berdasarkan tag seperti:
tes bazel ///... --test_tag_filters=ini,-bukan-ini
Untuk menjalankan pengujian unit:
tes bazel //java/... --test_size_filters=kecil
Untuk menjalankan pengujian integrasi:
tes bazel //java/... --test_size_filters=medium
Untuk menjalankan pengujian browser:
tes bazel //java/... --test_size_filters=besar --test_tag_filters=
Untuk menjalankan tes tertentu:
tes bazel //java/test/org/openqa/selenium/chrome:ChromeDriverFunctionalTest
Untuk menjalankan pengujian, jalankan:
tes bazel //javascript/node/selenium-webdriver:tests
Anda dapat menggunakan --test_env
untuk memasukkan nama browser sebagai SELENIUM_BROWSER
.
tes bazel //javascript/node/selenium-webdriver:tes --test_env=SELENIUM_BROWSER=firefox
Jalankan pengujian unit dengan:
tes bazel //py:unit
Untuk menjalankan pengujian dengan browser tertentu:
tes bazel //py:tes-
Untuk menjalankan semua tes Python:
tes bazel //py:semua
Target pengujian:
Memerintah | Keterangan |
---|---|
bazel test //rb/... | Jalankan unit, semua pengujian integrasi, dan lint |
bazel test //rb:lint | Jalankan linter RuboCop |
bazel test //rb/spec/... | Jalankan pengujian unit dan integrasi untuk semua browser |
bazel test //rb/spec/... --test_size_filters small | Jalankan pengujian unit |
bazel test //rb/spec/unit/... | Jalankan pengujian unit |
bazel test //rb/spec/... --test_size_filters large | Jalankan tes integrasi untuk semua browser |
bazel test //rb/spec/integration/... | Jalankan tes integrasi untuk semua browser |
bazel test //rb/spec/integration/... --test_tag_filters firefox | Jalankan pengujian integrasi hanya untuk Firefox lokal |
bazel test //rb/spec/integration/... --test_tag_filters firefox-remote | Jalankan tes integrasi hanya untuk Firefox jarak jauh |
bazel test //rb/spec/integration/... --test_tag_filters firefox,firefox-remote | Jalankan tes integrasi untuk Firefox lokal dan jarak jauh |
Target pengujian Ruby memiliki nama yang sama dengan file spesifikasi dengan _spec.rb
dihapus, sehingga Anda dapat menjalankannya satu per satu. Target pengujian integrasi juga memiliki browser dan akhiran jarak jauh untuk mengontrol browser mana yang akan dipilih dan apakah akan menggunakan Grid.
Berkas uji | Sasaran uji |
---|---|
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 |
Browser yang didukung:
chrome
edge
firefox
firefox-beta
ie
safari
safari-preview
Selain Contoh Opsi Umum, berikut adalah beberapa contoh tambahan khusus Ruby:
--test_arg "-eTimeouts"
- uji spesifikasi saja yang namanya menyertakan "Timeout"
--test_arg "
- berikan argumen RSpec tambahan apa pun (lihat bazel run @bundle//bin:rspec -- --help
)
Variabel lingkungan yang didukung untuk digunakan dengan --test_env
:
WD_SPEC_DRIVER
- driver yang akan diuji; baik nama browser atau 'jarak jauh' (disetel oleh Bazel)
WD_REMOTE_BROWSER
- ketika WD_SPEC_DRIVER
remote
; nama browser yang akan diuji (ditetapkan oleh Bazel)
WD_REMOTE_URL
- URL server yang sudah berjalan untuk digunakan dalam pengujian jarak jauh
DOWNLOAD_SERVER
- ketika WD_REMOTE_URL
tidak disetel; apakah akan mengunduh dan menggunakan versi server terbaru yang dirilis untuk pengujian jarak jauh
DEBUG
- mengaktifkan debugging verbose
HEADLESS
- untuk chrome, edge dan firefox; menjalankan tes dalam mode tanpa kepala
DISABLE_BUILD_CHECK
- untuk chrome dan edge; apakah akan mengabaikan ketidakcocokan versi driver dan browser (memungkinkan pengujian build Canary)
CHROME_BINARY
- jalur untuk menguji browser Chrome tertentu
CHROMEDRIVER_BINARY
- jalur untuk menguji ChromeDriver tertentu
EDGE_BINARY
- jalur untuk menguji browser Edge tertentu
MSEDGEDRIVER_BINARY
- jalur untuk menguji msedgedriver tertentu
FIREFOX_BINARY
- jalur untuk menguji browser Firefox tertentu
GECKODRIVER_BINARY
- jalur untuk menguji GeckoDriver tertentu
Untuk menjalankan Ruby dengan versi tertentu, Anda dapat mengubah versinya di rb/.ruby-version
atau dari baris perintah:
gema '' > rb/.versi-ruby
Pengujian .NET saat ini hanya berfungsi dengan browser yang disematkan, jadi pastikan untuk menyertakannya.
Jalankan semua tes dengan:
tes bazel //dotnet/test/common:AllTests --pin_browsers=true
Anda dapat menjalankan tes tertentu dengan menentukan nama kelas:
tes bazel //dotnet/test/common:ElementFindingTest --pin_browsers=true
Jika modul mendukung banyak browser:
tes bazel //dotnet/test/common:ElementFindingTest-edge --pin_browsers=true
Tes karat dijalankan dengan:
tes bazel //karat/...
Secara default, Bazel menjalankan pengujian ini di UI server X Anda saat ini. Jika mau, Anda juga dapat menjalankannya di server X virtual atau bersarang.
Jalankan X server Xvfb :99
atau Xnest :99
Jalankan window manager, misalnya DISPLAY=:99 jwm
Jalankan tes yang Anda minati:
tes bazel --test_env=DISPLAY=:99 //java/... --test_tag_filters=chrome
Cara mudah untuk menjalankan pengujian di server X virtual adalah dengan menggunakan fungsionalitas --run_under
Bazel:
bazel test --run_under="xvfb-run -a" //java/...
Dokumentasi API dapat ditemukan di sini:
C#
JavaScript
Jawa
ular piton
Rubi
Untuk memperbarui dokumentasi API untuk bahasa tertentu: ./go
Untuk memperbarui semua dokumentasi: ./go all:docs
Perhatikan bahwa pembuatan JavaScript saat ini rusak.
Proses lengkap untuk melakukan rilis dapat ditemukan di wiki
Merilis adalah kombinasi antara pembuatan dan penerbitan, yang sering kali memerlukan koordinasi beberapa eksekusi dan pemrosesan tambahan. Seperti yang dibahas di bagian Membangun, kami menggunakan tugas Rake dengan perintah ./go
untuk hal ini. Perintah ./go
ini menyertakan argumen --stamp
untuk memberikan informasi yang diperlukan tentang aset yang dibangun.
Anda dapat membangun dan melepaskan semuanya dengan:
./pergi semua:rilis
Untuk membangun dan merilis bahasa tertentu:
./go:rilis
Jika Anda memiliki akses ke repositori Selenium EngFlow, Anda dapat membuat aset dari jarak jauh dan mengunduh secara lokal menggunakan:
./pergi semua:rilis['--config', 'rilis']