Kerangka Otomatisasi Browser Lengkap:
Perayapan / Pengujian / Pengikisan / Siluman Web
Mulai | ? Fitur | ?️ Pilihan | Contoh | ? Skrip | Seluler
API | ? Format | ? Perekam | Dasbor | ? Lokal | Peternakan
?️ GUI | ? Halaman Uji | ? Modus UC | ? Modus CDP | ? Grafik | jaringan
?️ Bagaimana | ? Migrasi | Rencana Kasus | ♻️ Templat | ? Hibrida | ? Tur
? CI/CD | ?️ JSMgr | ? Penerjemah | Pembawa acara | ? Dialog | ?️ Visual
SeleniumBase adalah perangkat profesional untuk aktivitas otomatisasi web. Dibuat untuk menguji situs web, melewati CAPTCHA, meningkatkan produktivitas, menyelesaikan tugas, dan meningkatkan skala bisnis Anda.
Belajar dari lebih dari 200 contoh di folder SeleniumBase/examples/ .
? Perhatikan bahwa SeleniumBase UC Mode (Stealth Mode) memiliki ReadMe sendiri.
? Perhatikan juga bahwa Mode CDP Seleniumbase memiliki ReadMe tersendiri.
Skrip dapat dipanggil melalui python
, meskipun beberapa Format Sintaks mengharapkan pytest (kerangka pengujian unit Python yang disertakan dengan SeleniumBase yang dapat menemukan, mengumpulkan, dan menjalankan pengujian secara otomatis).
? Inilah my_first_test.py, yang menguji login, belanja, dan checkout:
pytest my_first_test.py
pytest
menggunakan--chrome
secara default kecuali diatur secara berbeda.
? Inilah test_coffee_cart.py, yang memverifikasi situs e-commerce:
pytest test_coffee_cart.py --demo
(
--demo
memperlambat pengujian dan menyoroti tindakan)
? Inilah test_demo_site.py, yang mencakup beberapa tindakan:
pytest test_demo_site.py
Mudah untuk mengetik, mengklik, memilih, beralih, menarik & melepas, dan banyak lagi.
(Untuk contoh selengkapnya, lihat folder SeleniumBase/examples/.)
Jelajahi README:
- Memulai / Instalasi
- Contoh Dasar / Penggunaan
- Metode Tes Umum
- Fakta Menarik / Pelajari Lebih Lanjut
- Mode Demo/Debug
- Opsi Baris Perintah
- Konfigurasi Direktori
- Dasbor SeleniumBase
- Menghasilkan Laporan Pengujian
SeleniumBase adalah kerangka kerja Python untuk otomatisasi dan pengujian browser. SeleniumBase menggunakan API Selenium/WebDriver dan menggabungkan pelari pengujian seperti pytest
, pynose
, dan behave
untuk menyediakan struktur terorganisir, penemuan pengujian, eksekusi pengujian, status pengujian ( misalnya lulus, gagal, atau dilewati ), dan opsi baris perintah untuk mengubah pengaturan default ( mis. pemilihan browser ). Dengan Selenium mentah, Anda perlu menyiapkan parser opsi Anda sendiri untuk mengonfigurasi pengujian dari baris perintah.
Manajer driver SeleniumBase memberi Anda kontrol lebih besar atas pengunduhan driver otomatis. (Gunakan --driver-version=VER
dengan perintah pytest
run Anda untuk menentukan versi.) Secara default, SeleniumBase akan mengunduh versi driver yang cocok dengan versi browser utama Anda jika tidak disetel.
SeleniumBase secara otomatis mendeteksi antara Pemilih CSS dan XPath, yang berarti Anda tidak perlu menentukan jenis pemilih dalam perintah Anda ( tetapi secara opsional Anda bisa ).
Metode SeleniumBase sering kali melakukan beberapa tindakan dalam satu pemanggilan metode. Misalnya, self.type(selector, text)
melakukan hal berikut:
1. Menunggu hingga elemen terlihat.
2. Menunggu elemen menjadi interaktif.
3. Menghapus kolom teks.
4. Ketik teks baru.
5. Tekan Enter/Submit jika teks berakhiran "n"
.
Dengan Selenium mentah, tindakan tersebut memerlukan beberapa pemanggilan metode.
SeleniumBase menggunakan nilai batas waktu default jika tidak disetel:
✅ self.click("button")
Dengan Selenium mentah, metode akan langsung gagal ( secara default ) jika suatu elemen memerlukan lebih banyak waktu untuk dimuat:
self.driver.find_element(by="css selector", value="button").click()
(Kode yang dapat diandalkan lebih baik daripada kode yang tidak dapat diandalkan.)
SeleniumBase memungkinkan Anda mengubah nilai batas waktu metode secara eksplisit:
✅ self.click("button", timeout=10)
Dengan Selenium mentah, itu memerlukan lebih banyak kode:
WebDriverWait(driver, 10).until(EC.element_to_be_clickable("css selector", "button")).click()
(Kode sederhana lebih baik daripada kode rumit.)
SeleniumBase memberi Anda keluaran kesalahan yang bersih ketika pengujian gagal. Dengan Selenium mentah, pesan kesalahan bisa menjadi sangat berantakan.
SeleniumBase memberi Anda opsi untuk membuat dasbor dan laporan untuk pengujian. Ini juga menyimpan tangkapan layar dari pengujian yang gagal ke folder ./latest_logs/
. Selenium mentah tidak memiliki opsi ini secara langsung.
SeleniumBase menyertakan aplikasi GUI desktop untuk menjalankan pengujian, seperti SeleniumBase Commander untuk pytest
dan SeleniumBase Behave GUI untuk behave
.
SeleniumBase memiliki Perekam/Generator Tes sendiri untuk membuat tes dari tindakan browser manual.
SeleniumBase dilengkapi dengan perangkat lunak manajemen kasus uji, ("CasePlans"), untuk mengatur pengujian dan deskripsi langkah.
SeleniumBase menyertakan alat untuk membuat aplikasi data, ("ChartMaker"), yang dapat menghasilkan JavaScript dari Python.
Pelajari tentang berbagai cara menulis tes:
Inilah test_simple_login.py, yang menggunakan warisan kelas BaseCase
, dan dijalankan dengan pytest atau pynose. (Gunakan self.driver
untuk mengakses driver
mentah 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" )
? Berikut tes dari sb_fixture_tests.py, yang menggunakan perlengkapan sb
pytest
. Berjalan dengan pytest. (Gunakan sb.driver
untuk mengakses driver
mentah 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" )
? Inilah raw_login_sb.py, yang menggunakan SB
Context Manager. Berjalan dengan python
murni. (Gunakan sb.driver
untuk mengakses driver
mentah 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" )
? Inilah raw_login_context.py, yang menggunakan DriverContext
Manager. Berjalan dengan python
murni. ( driver
adalah versi perbaikan dari driver
mentah Selenium, dengan lebih banyak metode.)
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" )
? Inilah raw_login_driver.py, yang menggunakan Driver
Manager. Berjalan dengan python
murni. ( driver
adalah versi perbaikan dari driver
mentah Selenium, dengan lebih banyak metode.)
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 ()
Inilah login_app.feature, yang menggunakan sintaksis behavior-BDD Gherkin. Berjalan dengan behave
. (Pelajari tentang integrasi perilaku-BDD SeleniumBase )
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"
? Tambahkan Python dan Git ke PATH Sistem Anda.
? Disarankan menggunakan env virtual Python.
Anda dapat menginstal seleniumbase
dari PyPI atau GitHub:
? Cara menginstal seleniumbase
dari PyPI:
pip install seleniumbase
--upgrade
OR -U
untuk meningkatkan SeleniumBase.)--force-reinstall
untuk meningkatkan paket tidak langsung.)pip3
jika ada beberapa versi Python.) ? Cara menginstal seleniumbase
dari klon GitHub:
git clone https://github.com/seleniumbase/SeleniumBase.git
cd SeleniumBase/
pip install -e .
? Cara memutakhirkan instalasi yang sudah ada dari klon GitHub:
git pull
pip install -e .
? Ketik seleniumbase
atau sbase
untuk memverifikasi bahwa SeleniumBase berhasil diinstal:
___ _ _ ___
/ __ | ___ | | ___ _ _ (_)_ _ _ __ | _ ) __ _ ______
_ _ / -_) / -_) ' | | | | ' | _ / _ ` (_- < -_)
| ___/ _ __ | _ _ __ | _ || _ | _ | _ ,_ | _ | _ | _ | ___/ _ _,_/__ | ___ |
----------------------------------------------------
╭──────────────────────────────────────────────────╮
│ * 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 secara otomatis mengunduh webdriver sesuai kebutuhan, seperti 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 !
? Jika Anda telah mengkloning SeleniumBase, Anda dapat menjalankan tes dari folder contoh/.
Ini my_first_test.py:
cd examples/
pytest my_first_test.py
Berikut kode untuk 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.
? Untuk daftar lengkap metode SeleniumBase, lihat: Ringkasan Metode
✅ SeleniumBase secara otomatis menangani tindakan WebDriver umum seperti meluncurkan browser web sebelum pengujian, menyimpan tangkapan layar jika terjadi kegagalan, dan menutup browser web setelah pengujian.
✅ SeleniumBase memungkinkan Anda menyesuaikan pengujian melalui opsi baris perintah.
✅ SeleniumBase menggunakan sintaks sederhana untuk perintah. Contoh:
self . type ( "input" , "dogs n " ) # (The "n" presses ENTER)
Kebanyakan skrip SeleniumBase dapat dijalankan dengan pytest
, pynose
, atau python
murni. Tidak semua test runner dapat menjalankan semua format pengujian. Misalnya, pengujian yang menggunakan perlengkapan sb
pytest hanya dapat dijalankan dengan pytest
. (Lihat Format Sintaks) Ada juga format pengujian Gherkin yang dijalankan dengan perilaku.
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
menyertakan penemuan pengujian otomatis. Jika Anda tidak menentukan file atau folder tertentu untuk dijalankan, pytest
akan secara otomatis mencari seluruh subdirektori untuk menjalankan pengujian berdasarkan kriteria berikut:
test_
atau diakhiri dengan _test.py
.test_
. Dengan adanya file SeleniumBase pytest.ini, Anda dapat mengubah pengaturan penemuan default. Nama kelas Python bisa apa saja karena seleniumbase.BaseCase
mewarisi unittest.TestCase
untuk memicu penemuan otomatis.
✅ Anda dapat melakukan pemeriksaan pra-penerbangan untuk melihat tes mana yang akan ditemukan oleh pytest
sebelum dijalankan sebenarnya:
pytest --co -q
✅ Anda bisa lebih spesifik saat memanggil pytest
atau pynose
pada suatu file:
pytest [FILE_NAME.py]::[CLASS_NAME]::[METHOD_NAME]
pynose [FILE_NAME.py]:[CLASS_NAME].[METHOD_NAME]
✅ Tidak Ada Lagi Tes yang Tidak Bermasalah! Metode SeleniumBase secara otomatis menunggu elemen halaman selesai dimuat sebelum berinteraksi dengannya ( hingga batas waktu habis ). Ini berarti Anda tidak lagi memerlukan pernyataan time.sleep()
acak di skrip Anda.
✅ SeleniumBase mendukung semua browser dan sistem operasi utama:
Browser: Chrome, Edge, Firefox, dan Safari.
Sistem: Linux/Ubuntu, macOS, dan Windows.
✅ SeleniumBase berfungsi di semua platform CI/CD populer:
✅ SeleniumBase menyertakan solusi hibrid otomatis/manual yang disebut MasterQA untuk mempercepat pengujian manual dengan otomatisasi sementara penguji manual menangani validasi.
✅ SeleniumBase mendukung pengujian yang dijalankan saat offline ( dengan asumsi driver web sebelumnya telah diunduh saat online ).
✅ Untuk daftar lengkap fitur SeleniumBase, Klik Disini.
? Mode Demo membantu Anda melihat apa yang sedang dilakukan tes. Jika pengujian berjalan terlalu cepat di mata Anda, jalankan pengujian dalam Mode Demo untuk menghentikan sementara browser di antara tindakan, menyorot elemen halaman yang sedang dikerjakan, dan menampilkan pernyataan:
pytest my_first_test.py --demo
? time.sleep(seconds)
dapat digunakan untuk membuat tes menunggu di tempat tertentu:
import time ; time . sleep ( 3 ) # Do nothing for 3 seconds.
? Mode Debug dengan pustaka pdb bawaan Python membantu Anda men-debug pengujian:
import pdb ; pdb . set_trace ()
import pytest ; pytest . set_trace ()
breakpoint () # Shortcut for "import pdb; pdb.set_trace()"
(perintah
pdb
:n
,c
,s
,u
,d
=>next
,continue
,step
,up
,down
)
? Untuk menjeda pengujian aktif yang memunculkan pengecualian atau kesalahan, ( dan membiarkan jendela browser tetap terbuka saat Mode Debug dimulai di konsol ), tambahkan --pdb
sebagai opsi pytest
:
pytest test_fail.py --pdb
? Untuk memulai pengujian dalam Mode Debug, tambahkan --trace
sebagai opsi pytest
:
pytest test_coffee_cart.py --trace
✅ Berikut beberapa opsi baris perintah berguna yang disertakan dengan 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 menyediakan opsi baris perintah pytest
tambahan untuk pengujian:
--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.)
(Lihat daftar lengkap definisi opsi baris perintah di sini . Untuk contoh detail opsi baris perintah, lihat customizing_test_runs.md )
? Selama pengujian gagal, log dan tangkapan layar dari pengujian terbaru akan disimpan ke folder_logs latest_logs/
. Log tersebut akan dipindahkan ke archived_logs/
jika Anda menambahkan --archive_logs ke opsi baris perintah, atau mengatur ARCHIVE_EXISTING_LOGS
ke True di settings.py, jika tidak, file log akan dibersihkan pada awal uji coba berikutnya. Koleksi test_suite.py
berisi pengujian yang sengaja gagal sehingga Anda dapat melihat cara kerja logging.
cd examples/
pytest test_suite.py --chrome
pytest test_suite.py --firefox
Cara mudah untuk mengganti Seleniumbase/config/settings.py adalah dengan menggunakan file pengaturan khusus. Berikut opsi baris perintah untuk ditambahkan ke pengujian: (Lihat contoh/custom_settings.py) --settings_file=custom_settings.py
(Pengaturan mencakup nilai batas waktu default, kunci autentikasi dua faktor, kredensial DB, kredensial S3, dan pengaturan penting lainnya digunakan oleh tes.)
? Untuk meneruskan data tambahan dari baris perintah ke pengujian, tambahkan --data="ANY STRING"
. Di dalam pengujian Anda, Anda dapat menggunakan self.data
untuk mengaksesnya.
? Saat menjalankan pengujian dengan pytest
, Anda memerlukan salinan pytest.ini di folder root Anda. Saat menjalankan pengujian dengan pynose
, Anda memerlukan salinan setup.cfg di folder root Anda. File-file ini menentukan detail konfigurasi default untuk pengujian. Folder pengujian juga harus menyertakan file init .py kosong agar file pengujian Anda dapat mengimpor file lain dari folder tersebut.
? sbase mkdir DIR
membuat folder dengan file konfigurasi dan contoh tes:
sbase mkdir ui_tests
Folder baru itu akan berisi file-file ini:
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
ProTip™: Anda juga dapat membuat folder boilerplate tanpa pengujian sampel apa pun di dalamnya dengan menambahkan -b
atau --basic
ke perintah sbase mkdir
:
sbase mkdir ui_tests --basic
Folder baru itu akan berisi file-file ini:
ui_tests/
├── __init__.py
├── pytest.ini
├── requirements.txt
└── setup.cfg
Dari file-file tersebut, file konfigurasi pytest.ini
adalah yang paling penting, diikuti oleh file __init__.py
kosong. Ada juga file setup.cfg
(untuk pynose). Terakhir, file requirements.txt
dapat digunakan untuk membantu Anda menginstal Seleniumbase ke lingkungan Anda (jika belum diinstal).
Mari kita coba contoh pengujian yang gagal:
""" 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
Anda dapat menjalankannya dari folder examples/
seperti ini:
pytest test_fail.py
? Anda akan melihat bahwa folder log, "latest_logs", dibuat untuk menyimpan informasi tentang pengujian yang gagal, dan tangkapan layar. Selama pengujian dijalankan, hasil sebelumnya dipindahkan ke folder archived_logs jika ARCHIVE_EXISTING_LOGS Anda disetel ke True di settings.py, atau jika Anda menjalankan pengujian dengan --archive-logs
. Jika Anda memilih untuk tidak mengarsipkan log yang ada, log tersebut akan dihapus dan diganti dengan log pengujian yang terakhir dijalankan.
? Opsi --dashboard
untuk pytest menghasilkan SeleniumBase Dashboard yang terletak di dashboard.html
, yang diperbarui secara otomatis saat pengujian dijalankan dan membuahkan hasil. Contoh:
pytest --dashboard --rs --headless
? Selain itu, Anda dapat meng-host Server Dasbor SeleniumBase Anda sendiri pada port pilihan Anda. Berikut ini contohnya menggunakan http.server
Python :
python -m http.server 1948
? Sekarang Anda dapat menavigasi ke http://localhost:1948/dashboard.html
untuk melihat dasbor sebagai aplikasi web. Ini memerlukan dua jendela terminal yang berbeda: satu untuk menjalankan server, dan satu lagi untuk menjalankan pengujian, yang harus dijalankan dari direktori yang sama. (Gunakan Ctrl+C untuk menghentikan server http.)
? Berikut ini contoh lengkap tampilan Dashboard SeleniumBase:
pytest test_suite.py test_image_saving.py --dashboard --rs --headless
pytest
: ✅ Menggunakan --html=report.html
memberi Anda laporan bagus tentang nama yang ditentukan setelah rangkaian pengujian Anda selesai.
pytest test_suite.py --html=report.html
✅ Saat menggabungkan laporan html pytest dengan penggunaan Dasbor SeleniumBase, diagram lingkaran dari Dasbor akan ditambahkan ke laporan html. Selain itu, jika Anda menyetel URL laporan html agar sama dengan URL Dasbor saat juga menggunakan dasbor, (contoh: --dashboard --html=dashboard.html
), maka Dasbor akan menjadi laporan html lanjutan saat semua tes selesai.
✅ Berikut contoh laporan html yang ditingkatkan:
pytest test_suite.py --dashboard --html=report.html
Jika melihat laporan html pytest di Jenkins, Anda mungkin perlu mengonfigurasi pengaturan Jenkins agar html dapat dirender dengan benar. Hal ini disebabkan oleh perubahan Jenkins CSP.
Anda juga dapat menggunakan --junit-xml=report.xml
untuk mendapatkan laporan xml. Jenkins dapat menggunakan file ini untuk menampilkan pelaporan yang lebih baik untuk pengujian Anda.
pytest test_suite.py --junit-xml=report.xml
pynose
: Opsi --report
memberi Anda laporan menarik setelah rangkaian pengujian Anda selesai.
pynose test_suite.py --report
(CATATAN: Anda dapat menambahkan --show-report
untuk segera menampilkan laporan pynose setelah rangkaian pengujian selesai. Hanya gunakan --show-report
saat menjalankan pengujian secara lokal karena ini menghentikan sementara pengujian.)
behave
Dasbor & Laporan:(Folder berperilaku_bdd/ dapat ditemukan di folder contoh/.)
behave behave_bdd/features/ -D dashboard -D headless
Anda juga dapat menggunakan --junit
untuk mendapatkan laporan .xml
untuk setiap fitur behave
. Jenkins dapat menggunakan file ini untuk menampilkan pelaporan yang lebih baik untuk pengujian Anda.
behave behave_bdd/features/ --junit -D rs -D headless
Lihat: https://allurereport.org/docs/pytest/
SeleniumBase tidak lagi menyertakan allure-pytest
sebagai bagian dari dependensi yang diinstal. Jika ingin menggunakannya, instal terlebih dahulu:
pip install allure-pytest
Sekarang pengujian Anda dapat membuat file hasil Allure, yang dapat diproses oleh Allure Reports.
pytest test_suite.py --alluredir=allure_results
Jika Anda ingin menggunakan server proxy untuk pengujian browser Anda (Chromium atau Firefox), Anda dapat menambahkan --proxy=IP_ADDRESS:PORT
sebagai argumen pada baris perintah.
pytest proxy_test.py --proxy=IP_ADDRESS:PORT
Jika server proxy yang ingin Anda gunakan memerlukan autentikasi, Anda dapat melakukan hal berikut (khusus Chromium):
pytest proxy_test.py --proxy=USERNAME:PASSWORD@IP_ADDRESS:PORT
SeleniumBase juga mendukung proxy SOCKS4 dan SOCKS5:
pytest proxy_test.py --proxy= " socks4://IP_ADDRESS:PORT "
pytest proxy_test.py --proxy= " socks5://IP_ADDRESS:PORT "
Untuk mempermudah, Anda dapat menambahkan proxy yang sering digunakan ke PROXY_LIST di proxy_list.py, lalu menggunakan --proxy=KEY_FROM_PROXY_LIST
untuk menggunakan IP_ADDRESS:PORT kunci tersebut.
pytest proxy_test.py --proxy=proxy1
? Jika Anda ingin mengubah Agen-Pengguna untuk pengujian browser Anda (khusus Chromium dan Firefox), Anda dapat menambahkan --agent="USER AGENT STRING"
sebagai argumen pada baris perintah.
pytest user_agent_test.py --agent= " Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1.7412.EU "
? self.accept_alert()
secara otomatis menunggu dan menerima pop-up peringatan. self.dismiss_alert()
secara otomatis menunggu dan menolak pop-up peringatan. Kadang-kadang, beberapa metode seperti self.click(SELECTOR)
mungkin menutup pop-up dengan sendirinya karena memanggil JavaScript untuk memastikan bahwa readyState
halaman telah complete
sebelum melanjutkan. Jika Anda mencoba menerima pop-up yang ditutup dengan cara ini, gunakan solusi ini: Panggil self.find_element(SELECTOR).click()
sebagai gantinya, (yang akan membiarkan pop-up tetap ada di layar), lalu gunakan self.accept_alert()
untuk menerima pop-up (lebih lanjut tentang itu di sini). Jika pop-up terputus-putus, bungkus kode dalam blok coba/kecuali.
? Pelajari tentang Panduan Interaktif SeleniumBase (dalam folder examples/tour_examples/
). Ini bagus untuk membuat prototipe pengalaman orientasi situs web.
--with-s3-logging
pada baris perintah saat menjalankan pengujian Anda.Berikut ini contoh menjalankan pengujian dengan beberapa fitur tambahan diaktifkan:
pytest [YOUR_TEST_FILE.py] --with-db-reporting --with-s3-logging
? Menavigasi ke halaman web: (dan perintah terkait)
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.
ProTip™: Anda dapat menggunakan metode self.get_page_source()
dengan perintah find()
Python untuk menguraikan HTML guna menemukan sesuatu yang spesifik. (Untuk penguraian lebih lanjut, lihat contoh 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 ]
? Mengklik:
Untuk mengklik elemen pada halaman:
self . click ( "div#my_id" )
ProTip™: Di sebagian besar browser web, Anda dapat mengklik kanan halaman dan memilih Inspect Element
untuk melihat detail pemilih CSS yang Anda perlukan untuk membuat skrip Anda sendiri.
? Mengetik Teks:
self.type(selector, text)
# memperbarui teks dari elemen yang ditentukan dengan nilai yang ditentukan. Pengecualian dimunculkan jika elemen hilang atau jika bidang teks tidak dapat diedit. Contoh:
self . type ( "input#id_value" , "2012" )
Anda juga dapat menggunakan perintah self.add_text()
atau WebDriver .send_keys()
, namun perintah tersebut tidak akan menghapus kotak teks terlebih dahulu jika sudah ada teks di dalamnya.
? Mendapatkan teks dari elemen pada halaman:
text = self . get_text ( "header h2" )
? Mendapatkan nilai atribut dari elemen pada halaman:
attribute = self . get_attribute ( "#comic img" , "title" )
? Menegaskan keberadaan elemen pada halaman dalam beberapa detik:
self . wait_for_element_present ( "div.my_class" , timeout = 10 )
(CATATAN: Anda juga dapat menggunakan: self.assert_element_present(ELEMENT)
)
? Menegaskan visibilitas elemen pada halaman dalam beberapa detik:
self . wait_for_element_visible ( "a.my_class" , timeout = 5 )
(CATATAN: Versi singkatnya adalah self.find_element(ELEMENT)
dan self.assert_element(ELEMENT)
. Versi find_element()
mengembalikan elemen tersebut.)
Karena baris di atas mengembalikan elemen, Anda dapat menggabungkannya dengan .click()
seperti yang ditunjukkan di bawah ini:
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™: Anda dapat menggunakan titik untuk menandakan nama kelas (Contoh: div.class_name
) sebagai versi sederhana dari div[class="class_name"]
dalam pemilih CSS.
Anda juga dapat menggunakan *=
untuk mencari sebagian nilai apa pun dalam pemilih CSS seperti yang ditunjukkan di bawah ini:
self . click ( 'a[name*="partial_name"]' )
? Menegaskan visibilitas teks di dalam elemen pada halaman dalam beberapa detik:
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 )
(CATATAN: self.find_text(TEXT, ELEMENT)
dan self.wait_for_text(TEXT, ELEMENT)
juga melakukan ini. Untuk kompatibilitas mundur, nama metode lama tetap dipertahankan, tetapi batas waktu default mungkin berbeda.)
? Menegaskan Apa Pun:
self . assert_true ( var1 == var2 )
self . assert_false ( var1 == var2 )
self . assert_equal ( var1 , var2 )
? Pernyataan Bersyarat yang Berguna: (dengan contoh kreatif)
❓ is_element_visible(selector):
(terlihat di halaman)
if self . is_element_visible ( 'div#warning' ):
print ( "Red Alert: Something bad might be happening!" )
❓ is_element_present(selector):
(ada dalam 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):
(teks terlihat pada elemen)
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!" )
Jika pengujian Anda membuka tab/jendela baru, Anda dapat beralih ke tab/jendela tersebut. (SeleniumBase secara otomatis beralih ke tab baru yang tidak terbuka untuk about:blank
.)
self . switch_to_window ( 1 ) # This switches to the new tab (0 is the first one)
? iframe mengikuti prinsip yang sama seperti jendela baru: Anda harus beralih ke iframe terlebih dahulu jika ingin melakukan tindakan di sana:
self . switch_to_frame ( "iframe" )
# ... Now perform actions inside the iframe
self . switch_to_parent_frame () # Exit the current iframe
Untuk keluar dari beberapa iframe, gunakan self.switch_to_default_content()
. (Jika di dalam satu iframe, ini memiliki efek yang sama seperti 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
? Anda juga dapat menggunakan pengelola konteks untuk bertindak di dalam iframe:
with self . frame_switch ( "iframe" ):
# ... Now perform actions while inside the code block
# You have left the iframe
Ini juga berfungsi dengan iframe bersarang:
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 adalah pustaka JavaScript canggih yang memungkinkan Anda melakukan tindakan lanjutan di browser web. Jika halaman web yang Anda buka sudah memuat jQuery, Anda dapat segera mulai menjalankan skrip jQuery. Anda akan mengetahui hal ini karena halaman web akan berisi sesuatu seperti berikut dalam HTML:
< script src =" https://ajax.googleapis.com/ajax/libs/jquery/3.6.3/jquery.min.js " > </ script >
? Tidak apa-apa jika Anda ingin menggunakan jQuery pada halaman yang belum dimuat. Untuk melakukannya, jalankan perintah berikut terlebih dahulu:
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
(Sebagian besar perintah di atas dapat dilakukan langsung dengan metode SeleniumBase bawaan.)
❗ Beberapa situs web memiliki Kebijakan Keamanan Konten yang ketat untuk mencegah pengguna memuat jQuery dan perpustakaan eksternal lainnya ke situs web mereka. Jika Anda perlu menggunakan jQuery atau pustaka JS lain di situs web tersebut, tambahkan --disable-csp
sebagai opsi baris perintah pytest
untuk memuat ekstensi Chromium yang melewati 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
(Karena banyaknya permintaan, contoh pembuatan lalu lintas ini telah disertakan dalam SeleniumBase dengan metode self.generate_referral(start_page, end_page)
dan self.generate_traffic(start_page, end_page, loops)
.)
Katakanlah Anda ingin memverifikasi beberapa elemen berbeda pada halaman web dalam satu pengujian, namun Anda tidak ingin pengujian tersebut gagal hingga Anda memverifikasi beberapa elemen sekaligus sehingga Anda tidak perlu menjalankan kembali pengujian untuk menemukan lebih banyak elemen yang hilang. elemen pada halaman yang sama. Di sinilah peran pernyataan yang ditangguhkan. Berikut ini contohnya:
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()
dan deferred_assert_text()
akan menyimpan pengecualian apa pun yang akan dimunculkan. Untuk menghapus semua pernyataan tertunda yang gagal menjadi satu pengecualian, pastikan untuk memanggil self.process_deferred_asserts()
di akhir metode pengujian Anda. Jika pengujian Anda mencapai beberapa halaman, Anda dapat memanggil self.process_deferred_asserts()
sebelum menavigasi ke halaman baru sehingga tangkapan layar dari file log Anda cocok dengan URL tempat pernyataan yang ditangguhkan dibuat.
Jika Anda memerlukan akses ke perintah apa pun yang disertakan dengan WebDriver standar, Anda dapat memanggilnya secara langsung seperti ini:
self . driver . delete_all_cookies ()
capabilities = self . driver . capabilities
self . driver . find_elements ( "partial link text" , "GitHub" )
(Secara umum, Anda ingin menggunakan metode versi SeleniumBase jika tersedia.)
Anda dapat menggunakan pytest --reruns=NUM
untuk mencoba kembali pengujian yang gagal berkali-kali. Tambahkan --reruns-delay=SECONDS
untuk menunggu beberapa detik di antara percobaan ulang. Contoh:
pytest --reruns=1 --reruns-delay=1
Anda dapat menggunakan dekorator @retry_on_exception()
untuk mencoba kembali metode yang gagal. (Impor pertama: from seleniumbase import decorators
). Untuk mempelajari lebih lanjut tentang dekorator SeleniumBase, klik di sini.
"Tangkap bug di QA sebelum menerapkan kode ke Produksi!"