All-in-One-Browser-Automatisierungs-Framework:
Web-Crawling / Testen / Scraping / Stealth
Start | ? Funktionen | ?️ Optionen | Beispiele | ? Skripte | Mobile
APIs | ? Formate | ? Rekorder | Dashboard | ? Schauplätze | Bauernhof
?️ GUI | ? Testseite | ? UC-Modus | ? CDP-Modus | ? Diagramme | Netz
?️ Wie | ? Migrieren | Fallpläne | ♻️ Vorlage | ? Hybrid | ? Touren
? CI/CD | ?️ JSMgr | ? Übersetzer | Moderator | ? Dialog | ?️ Visuell
SeleniumBase ist das professionelle Toolkit für Web-Automatisierungsaktivitäten. Entwickelt zum Testen von Websites, zum Umgehen von CAPTCHAs, zur Steigerung der Produktivität, zum Erledigen von Aufgaben und zum Skalieren Ihres Unternehmens.
Lernen Sie aus über 200 Beispielen im Ordner SeleniumBase/examples/ .
? Beachten Sie, dass der SeleniumBase UC-Modus (Stealth-Modus) über eine eigene ReadMe-Datei verfügt.
? Beachten Sie auch, dass der Seleniumbase CDP-Modus über eine eigene separate ReadMe-Datei verfügt.
Skripte können über python
aufgerufen werden, obwohl einige Syntaxformate pytest erwarten (ein in SeleniumBase enthaltenes Python-Unit-Test-Framework, das Tests automatisch erkennen, sammeln und ausführen kann).
? Hier ist my_first_test.py, das Anmeldung, Einkaufen und Bezahlen testet:
pytest my_first_test.py
pytest
verwendet standardmäßig--chrome
, sofern nicht anders festgelegt.
? Hier ist test_coffee_cart.py, das eine E-Commerce-Site überprüft:
pytest test_coffee_cart.py --demo
(
--demo
Modus verlangsamt Tests und hebt Aktionen hervor)
? Hier ist test_demo_site.py, das mehrere Aktionen abdeckt:
pytest test_demo_site.py
Einfaches Tippen, Klicken, Auswählen, Umschalten, Ziehen und Ablegen und mehr.
(Weitere Beispiele finden Sie im Ordner SeleniumBase/examples/.)
Entdecken Sie die README-Datei:
- Erste Schritte / Installation
- Grundlegendes Beispiel / Verwendung
- Gängige Testmethoden
- Wissenswertes / Erfahren Sie mehr
- Demomodus / Debugging
- Befehlszeilenoptionen
- Verzeichniskonfiguration
- SeleniumBase-Dashboard
- Testberichte erstellen
SeleniumBase ist ein Python-Framework für die Browserautomatisierung und -tests. SeleniumBase verwendet Selenium/WebDriver-APIs und integriert Testläufer wie pytest
, pynose
und behave
um eine organisierte Struktur, Testerkennung, Testausführung, Teststatus ( z. B. bestanden, fehlgeschlagen oder übersprungen ) und Befehlszeilenoptionen zum Ändern bereitzustellen Standardeinstellungen ( z. B. Browserauswahl ). Mit rohem Selenium müssten Sie Ihren eigenen Optionsparser einrichten, um Tests über die Befehlszeile zu konfigurieren.
Der Treibermanager von SeleniumBase gibt Ihnen mehr Kontrolle über automatische Treiber-Downloads. (Verwenden Sie --driver-version=VER
mit Ihrem pytest
-Ausführungsbefehl, um die Version anzugeben.) Standardmäßig lädt SeleniumBase eine Treiberversion herunter, die Ihrer Hauptbrowserversion entspricht, wenn diese nicht festgelegt ist.
SeleniumBase erkennt automatisch zwischen CSS-Selektoren und XPath, was bedeutet, dass Sie den Typ des Selektors nicht in Ihren Befehlen angeben müssen ( optional könnten Sie dies aber tun ).
SeleniumBase-Methoden führen häufig mehrere Aktionen in einem einzigen Methodenaufruf aus. Beispielsweise führt self.type(selector, text)
Folgendes aus:
1. Wartet darauf, dass das Element sichtbar ist.
2. Wartet darauf, dass das Element interaktiv ist.
3. Löscht das Textfeld.
4. Geben Sie den neuen Text ein.
5. Drücken Sie die Eingabetaste/Senden-Taste, wenn der Text mit "n"
endet.
Bei rohem Selenium erfordern diese Aktionen mehrere Methodenaufrufe.
SeleniumBase verwendet Standard-Timeout-Werte, wenn diese nicht festgelegt sind:
✅ self.click("button")
Mit rohem Selen würden Methoden ( standardmäßig ) sofort fehlschlagen, wenn ein Element mehr Zeit zum Laden benötigte:
self.driver.find_element(by="css selector", value="button").click()
(Zuverlässiger Code ist besser als unzuverlässiger Code.)
Mit SeleniumBase können Sie die expliziten Timeout-Werte von Methoden ändern:
✅ self.click("button", timeout=10)
Bei rohem Selenium ist dafür mehr Code erforderlich:
WebDriverWait(driver, 10).until(EC.element_to_be_clickable("css selector", "button")).click()
(Einfacher Code ist besser als komplexer Code.)
SeleniumBase liefert Ihnen eine saubere Fehlerausgabe, wenn ein Test fehlschlägt. Bei rohem Selen können Fehlermeldungen sehr chaotisch werden.
SeleniumBase bietet Ihnen die Möglichkeit, ein Dashboard und Berichte für Tests zu erstellen. Außerdem werden Screenshots von fehlgeschlagenen Tests im Ordner ./latest_logs/
gespeichert. Rohes Selen verfügt nicht standardmäßig über diese Optionen.
SeleniumBase umfasst Desktop-GUI-Apps zum Ausführen von Tests, wie SeleniumBase Commander für pytest
und SeleniumBase Behave GUI für behave
.
SeleniumBase verfügt über einen eigenen Recorder/Testgenerator zum Erstellen von Tests aus manuellen Browseraktionen.
SeleniumBase wird mit einer Testfallverwaltungssoftware („CasePlans“) zum Organisieren von Tests und Schrittbeschreibungen geliefert.
SeleniumBase enthält Tools zum Erstellen von Daten-Apps („ChartMaker“), die JavaScript aus Python generieren können.
Erfahren Sie mehr über verschiedene Arten, Tests zu schreiben:
Hier ist test_simple_login.py, das BaseCase
Klassenvererbung nutzt und mit pytest oder pynose ausgeführt wird. (Verwenden Sie self.driver
, um auf driver
von Selenium zuzugreifen.)
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" )
? Hier ist ein Test von sb_fixture_tests.py, der das sb
pytest
Fixture verwendet. Läuft mit Pytest. (Verwenden Sie sb.driver
um auf driver
von Selenium zuzugreifen.)
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" )
? Hier ist raw_login_sb.py, das den SB
Context Manager verwendet. Läuft mit reinem python
. (Verwenden Sie sb.driver
um auf driver
von Selenium zuzugreifen.)
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" )
? Hier ist raw_login_context.py, das den DriverContext
Manager verwendet. Läuft mit reinem python
. (Der driver
ist eine verbesserte Version des driver
von Selenium mit mehr Methoden.)
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" )
? Hier ist raw_login_driver.py, das den Driver
verwendet. Läuft mit reinem python
. (Der driver
ist eine verbesserte Version des driver
von Selenium mit mehr Methoden.)
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 ()
Hier ist login_app.feature, das die behave-BDD-Gherkin-Syntax verwendet. Läuft mit behave
. (Erfahren Sie mehr über die SeleniumBase-Behave-BDD- Integration)
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"
? Fügen Sie Python und Git zu Ihrem Systempfad hinzu.
? Die Verwendung einer virtuellen Python-Umgebung wird empfohlen.
Sie können seleniumbase
von PyPI oder GitHub installieren:
? So installieren Sie seleniumbase
von PyPI:
pip install seleniumbase
--upgrade
ODER -U
hinzu, um SeleniumBase zu aktualisieren.)--force-reinstall
hinzu, um indirekte Pakete zu aktualisieren.)pip3
, wenn mehrere Versionen von Python vorhanden sind.) ? So installieren Sie seleniumbase
von einem GitHub-Klon:
git clone https://github.com/seleniumbase/SeleniumBase.git
cd SeleniumBase/
pip install -e .
? So aktualisieren Sie eine vorhandene Installation von einem GitHub-Klon:
git pull
pip install -e .
? Geben Sie seleniumbase
oder sbase
ein, um zu überprüfen, ob SeleniumBase erfolgreich installiert wurde:
___ _ _ ___
/ __ | ___ | | ___ _ _ (_)_ _ _ __ | _ ) __ _ ______
_ _ / -_) / -_) ' | | | | ' | _ / _ ` (_- < -_)
| ___/ _ __ | _ _ __ | _ || _ | _ | _ ,_ | _ | _ | _ | ___/ _ _,_/__ | ___ |
----------------------------------------------------
╭──────────────────────────────────────────────────╮
│ * 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 lädt bei Bedarf automatisch Webtreiber herunter, z. B. 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 !
? Wenn Sie SeleniumBase geklont haben, können Sie Tests im Ordner „examples/“ ausführen.
Hier ist my_first_test.py:
cd examples/
pytest my_first_test.py
Hier ist der Code für 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.
? Die vollständige Liste der SeleniumBase-Methoden finden Sie unter: Methodenzusammenfassung
✅ SeleniumBase verarbeitet automatisch gängige WebDriver-Aktionen wie das Starten von Webbrowsern vor Tests, das Speichern von Screenshots bei Fehlern und das Schließen von Webbrowsern nach Tests.
✅ Mit SeleniumBase können Sie Tests über Befehlszeilenoptionen anpassen.
✅ SeleniumBase verwendet eine einfache Syntax für Befehle. Beispiel:
self . type ( "input" , "dogs n " ) # (The "n" presses ENTER)
Die meisten SeleniumBase-Skripte können mit pytest
, pynose
oder reinem python
ausgeführt werden. Nicht alle Testläufer können alle Testformate ausführen. Beispielsweise können Tests, die das sb
pytest-Fixture verwenden, nur mit pytest
ausgeführt werden. (Siehe Syntaxformate) Es gibt auch ein Gherkin-Testformat, das mit behave ausgeführt wird.
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
beinhaltet die automatische Testerkennung. Wenn Sie keine bestimmte Datei oder keinen bestimmten Ordner zum Ausführen angeben, durchsucht pytest
automatisch alle Unterverzeichnisse nach auszuführenden Tests basierend auf den folgenden Kriterien:
test_
beginnen oder mit _test.py
enden.test_
beginnen. Wenn eine SeleniumBase-pytest.ini-Datei vorhanden ist, können Sie die Standarderkennungseinstellungen ändern. Der Name der Python-Klasse kann beliebig sein, da seleniumbase.BaseCase
unittest.TestCase
erbt, um die automatische Erkennung auszulösen.
✅ Sie können einen Preflight-Check durchführen, um zu sehen, welche Tests vor der eigentlichen Ausführung von pytest
entdeckt werden:
pytest --co -q
✅ Sie können beim Aufrufen pytest
oder pynose
für eine Datei genauer vorgehen:
pytest [FILE_NAME.py]::[CLASS_NAME]::[METHOD_NAME]
pynose [FILE_NAME.py]:[CLASS_NAME].[METHOD_NAME]
✅ Keine flockigen Tests mehr! SeleniumBase-Methoden warten automatisch, bis die Seitenelemente vollständig geladen sind, bevor sie mit ihnen interagieren ( bis zu einem Zeitlimit ). Das bedeutet , dass Sie in Ihren Skripten keine zufälligen time.sleep()
-Anweisungen mehr benötigen .
✅ SeleniumBase unterstützt alle gängigen Browser und Betriebssysteme:
Browser: Chrome, Edge, Firefox und Safari.
Systeme: Linux/Ubuntu, macOS und Windows.
✅ SeleniumBase funktioniert auf allen gängigen CI/CD-Plattformen:
✅ SeleniumBase umfasst eine automatisierte/manuelle Hybridlösung namens MasterQA, um manuelle Tests durch Automatisierung zu beschleunigen, während manuelle Tester die Validierung übernehmen.
✅ SeleniumBase unterstützt die Ausführung von Tests im Offlinemodus ( vorausgesetzt, Webtreiber wurden zuvor online heruntergeladen ).
✅ Für eine vollständige Liste der SeleniumBase-Funktionen klicken Sie hier.
? Im Demomodus können Sie sehen, was ein Test tut. Wenn ein Test für Ihre Augen zu schnell abläuft, führen Sie ihn im Demo-Modus aus, um den Browser zwischen Aktionen kurz anzuhalten, Seitenelemente hervorzuheben, auf die reagiert wird, und Behauptungen anzuzeigen:
pytest my_first_test.py --demo
? time.sleep(seconds)
kann verwendet werden, um einen Test an einer bestimmten Stelle warten zu lassen:
import time ; time . sleep ( 3 ) # Do nothing for 3 seconds.
? Der Debug-Modus mit der integrierten pdb -Bibliothek von Python hilft Ihnen beim Debuggen von Tests:
import pdb ; pdb . set_trace ()
import pytest ; pytest . set_trace ()
breakpoint () # Shortcut for "import pdb; pdb.set_trace()"
(
pdb
-Befehle:n
,c
,s
,u
,d
=>next
,continue
,step
,up
,down
)
? Um einen aktiven Test anzuhalten, der eine Ausnahme oder einen Fehler auslöst ( und das Browserfenster geöffnet zu lassen, während der Debug-Modus in der Konsole beginnt ), fügen Sie --pdb
als pytest
-Option hinzu:
pytest test_fail.py --pdb
? Um Tests im Debug-Modus zu starten, fügen Sie --trace
als pytest
Option hinzu:
pytest test_coffee_cart.py --trace
✅ Hier sind einige nützliche Befehlszeilenoptionen, die mit pytest
geliefert werden:
-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 bietet zusätzliche pytest
-Befehlszeilenoptionen für Tests:
--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.)
(Die vollständige Liste der Befehlszeilenoptionsdefinitionen finden Sie hier . Detaillierte Beispiele für Befehlszeilenoptionen finden Sie unter „customizing_test_runs.md“ ).
? Bei Testfehlern werden Protokolle und Screenshots des letzten Testlaufs im Ordner latest_logs/
gespeichert. Diese Protokolle werden nach archived_logs/
verschoben, wenn Sie --archive_logs zu den Befehlszeilenoptionen hinzufügen oder ARCHIVE_EXISTING_LOGS
in „settings.py“ auf „True“ gesetzt haben. Andernfalls werden die Protokolldateien zu Beginn des nächsten Testlaufs bereinigt. Die test_suite.py
Sammlung enthält Tests, die absichtlich fehlschlagen, damit Sie sehen können, wie die Protokollierung funktioniert.
cd examples/
pytest test_suite.py --chrome
pytest test_suite.py --firefox
Eine einfache Möglichkeit, seleniumbase/config/settings.py zu überschreiben, ist die Verwendung einer benutzerdefinierten Einstellungsdatei. Hier ist die Befehlszeilenoption, die Sie zu Tests hinzufügen können: (Siehe examples/custom_settings.py) --settings_file=custom_settings.py
(Zu den Einstellungen gehören Standard-Timeout-Werte, ein Zwei-Faktor-Authentifizierungsschlüssel, DB-Anmeldeinformationen, S3-Anmeldeinformationen und andere wichtige Einstellungen wird von Tests verwendet.)
? Um zusätzliche Daten von der Befehlszeile an Tests zu übergeben, fügen Sie --data="ANY STRING"
hinzu. Innerhalb Ihrer Tests können Sie self.data
verwenden, um darauf zuzugreifen.
? Wenn Sie Tests mit pytest
ausführen, benötigen Sie eine Kopie von pytest.ini in Ihren Stammordnern. Wenn Sie Tests mit pynose
ausführen, benötigen Sie eine Kopie von setup.cfg in Ihren Stammordnern. Diese Dateien geben Standardkonfigurationsdetails für Tests an. Testordner sollten außerdem eine leere Init -.py- Datei enthalten, damit Ihre Testdateien andere Dateien aus diesem Ordner importieren können.
? sbase mkdir DIR
erstellt einen Ordner mit Konfigurationsdateien und Beispieltests:
sbase mkdir ui_tests
Dieser neue Ordner enthält diese Dateien:
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™: Sie können auch einen Boilerplate-Ordner ohne Beispieltests erstellen, indem Sie -b
oder --basic
zum Befehl sbase mkdir
hinzufügen:
sbase mkdir ui_tests --basic
Dieser neue Ordner enthält diese Dateien:
ui_tests/
├── __init__.py
├── pytest.ini
├── requirements.txt
└── setup.cfg
Von diesen Dateien ist die Konfigurationsdatei pytest.ini
die wichtigste, gefolgt von einer leeren Datei __init__.py
. Es gibt auch eine setup.cfg
Datei (für Pynose). Schließlich kann die Datei requirements.txt
verwendet werden, um Sie bei der Installation von Seleniumbase in Ihren Umgebungen zu unterstützen (falls es noch nicht installiert ist).
Versuchen wir es mit einem Beispiel für einen fehlgeschlagenen Test:
""" 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
Sie können es wie folgt aus dem Ordner examples/
ausführen:
pytest test_fail.py
? Sie werden feststellen, dass ein Protokollordner, „latest_logs“, erstellt wurde, um Informationen über den fehlgeschlagenen Test und Screenshots zu speichern. Bei Testläufen werden vergangene Ergebnisse in den Ordner archived_logs verschoben, wenn Sie ARCHIVE_EXISTING_LOGS in „settings.py“ auf „True“ gesetzt haben oder wenn Ihr Lauf mit --archive-logs
testet. Wenn Sie vorhandene Protokolle nicht archivieren möchten, werden diese gelöscht und durch die Protokolle des letzten Testlaufs ersetzt.
? Die Option --dashboard
für pytest generiert ein SeleniumBase-Dashboard unter dashboard.html
, das automatisch aktualisiert wird, wenn Tests ausgeführt werden und Ergebnisse liefern. Beispiel:
pytest --dashboard --rs --headless
? Darüber hinaus können Sie Ihren eigenen SeleniumBase Dashboard-Server auf einem Port Ihrer Wahl hosten. Hier ist ein Beispiel dafür mit Pythons http.server
:
python -m http.server 1948
? Jetzt können Sie zu http://localhost:1948/dashboard.html
navigieren, um das Dashboard als Web-App anzuzeigen. Dazu sind zwei unterschiedliche Terminalfenster erforderlich: eines zum Ausführen des Servers und eines zum Ausführen der Tests, die aus demselben Verzeichnis ausgeführt werden sollten. (Verwenden Sie Strg+C, um den http-Server zu stoppen.)
? Hier ist ein vollständiges Beispiel dafür, wie das SeleniumBase-Dashboard aussehen könnte:
pytest test_suite.py test_image_saving.py --dashboard --rs --headless
pytest
HTML-Berichte: ✅ Wenn Sie --html=report.html
verwenden, erhalten Sie nach Abschluss Ihrer Testsuite einen ausgefallenen Bericht mit dem angegebenen Namen.
pytest test_suite.py --html=report.html
✅ Wenn Sie Pytest-HTML-Berichte mit der Verwendung des SeleniumBase-Dashboards kombinieren, wird das Kreisdiagramm aus dem Dashboard zum HTML-Bericht hinzugefügt. Wenn Sie außerdem die URL des HTML-Berichts so festlegen, dass sie mit der Dashboard-URL übereinstimmt, wenn Sie auch das Dashboard verwenden (Beispiel: --dashboard --html=dashboard.html
), wird das Dashboard zu einem erweiterten HTML-Bericht, wenn alle Tests abgeschlossen.
✅ Hier ist ein Beispiel für einen aktualisierten HTML-Bericht:
pytest test_suite.py --dashboard --html=report.html
Wenn Sie Pytest-HTML-Berichte in Jenkins anzeigen, müssen Sie möglicherweise die Jenkins-Einstellungen konfigurieren, damit der HTML-Code korrekt gerendert wird. Dies ist auf Jenkins CSP-Änderungen zurückzuführen.
Sie können stattdessen auch --junit-xml=report.xml
verwenden, um einen XML-Bericht zu erhalten. Jenkins kann diese Datei verwenden, um bessere Berichte für Ihre Tests anzuzeigen.
pytest test_suite.py --junit-xml=report.xml
pynose
Berichte: Mit der Option --report
erhalten Sie nach Abschluss Ihrer Testsuite einen aussagekräftigen Bericht.
pynose test_suite.py --report
(HINWEIS: Sie können --show-report
hinzufügen, um Pynose-Berichte sofort nach Abschluss der Testsuite anzuzeigen. Verwenden Sie --show-report
nur, wenn Tests lokal ausgeführt werden, da dadurch der Testlauf angehalten wird.)
behave
Dashboard & Berichte:(Der Ordner „behave_bdd/“ befindet sich im Ordner „examples/“.)
behave behave_bdd/features/ -D dashboard -D headless
Sie können auch --junit
verwenden, um .xml
Berichte für jede behave
abzurufen. Jenkins kann diese Dateien verwenden, um bessere Berichte für Ihre Tests anzuzeigen.
behave behave_bdd/features/ --junit -D rs -D headless
Siehe: https://allurereport.org/docs/pytest/
SeleniumBase enthält allure-pytest
nicht mehr als Teil der installierten Abhängigkeiten. Wenn Sie es verwenden möchten, installieren Sie es zuerst:
pip install allure-pytest
Jetzt können Ihre Tests Allure-Ergebnisdateien erstellen, die von Allure Reports verarbeitet werden können.
pytest test_suite.py --alluredir=allure_results
Wenn Sie für Ihre Browsertests einen Proxyserver (Chromium oder Firefox) verwenden möchten, können Sie --proxy=IP_ADDRESS:PORT
als Argument in der Befehlszeile hinzufügen.
pytest proxy_test.py --proxy=IP_ADDRESS:PORT
Wenn der Proxyserver, den Sie verwenden möchten, eine Authentifizierung erfordert, können Sie Folgendes tun (nur Chromium):
pytest proxy_test.py --proxy=USERNAME:PASSWORD@IP_ADDRESS:PORT
SeleniumBase unterstützt auch SOCKS4- und SOCKS5-Proxys:
pytest proxy_test.py --proxy= " socks4://IP_ADDRESS:PORT "
pytest proxy_test.py --proxy= " socks5://IP_ADDRESS:PORT "
Um die Arbeit zu vereinfachen, können Sie Ihre häufig verwendeten Proxys zu PROXY_LIST in Proxy_list.py hinzufügen und dann --proxy=KEY_FROM_PROXY_LIST
verwenden, um die IP_ADDRESS:PORT dieses Schlüssels zu verwenden.
pytest proxy_test.py --proxy=proxy1
? Wenn Sie den User-Agent für Ihre Browsertests ändern möchten (nur Chromium und Firefox), können Sie --agent="USER AGENT STRING"
als Argument in der Befehlszeile hinzufügen.
pytest user_agent_test.py --agent= " Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1.7412.EU "
? self.accept_alert()
wartet automatisch auf Warn-Popups und akzeptiert diese. self.dismiss_alert()
wartet automatisch auf Warn-Popups und verwirft diese. Gelegentlich können einige Methoden wie self.click(SELECTOR)
ein Pop-up von selbst schließen, weil sie JavaScript aufrufen, um sicherzustellen, dass der readyState
der Seite complete
ist, bevor sie fortfährt. Wenn Sie versuchen, ein Pop-up zu akzeptieren, das auf diese Weise geschlossen wurde, verwenden Sie diese Problemumgehung: Rufen Sie stattdessen self.find_element(SELECTOR).click()
auf (wodurch das Pop-up auf dem Bildschirm verbleibt) und dann Verwenden Sie self.accept_alert()
um das Popup zu akzeptieren (mehr dazu hier). Wenn Popups zeitweise auftreten, schließen Sie den Code in einen Try/Except-Block ein.
? Erfahren Sie mehr über interaktive Komplettlösungen für SeleniumBase (im Ordner examples/tour_examples/
). Es eignet sich hervorragend zum Prototyping eines Website-Onboarding-Erlebnisses.
--with-s3-logging
in der Befehlszeile hinzu, wenn Sie Ihre Tests ausführen.Hier ist ein Beispiel für die Ausführung von Tests mit einigen aktivierten Zusatzfunktionen:
pytest [YOUR_TEST_FILE.py] --with-db-reporting --with-s3-logging
? Zu einer Webseite navigieren: (und zugehörige Befehle)
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™: Sie können die Methode self.get_page_source()
mit dem Python-Befehl find()
verwenden, um HTML zu analysieren, um etwas Bestimmtes zu finden. (Weitere Informationen zum Parsen finden Sie im BeautifulSoup-Beispiel.)
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 ]
? Klicken:
So klicken Sie auf ein Element auf der Seite:
self . click ( "div#my_id" )
ProTip™: In den meisten Webbrowsern können Sie mit der rechten Maustaste auf eine Seite klicken und „ Inspect Element
auswählen, um die CSS-Auswahldetails anzuzeigen, die Sie zum Erstellen Ihrer eigenen Skripte benötigen.
? Text eingeben:
self.type(selector, text)
# aktualisiert den Text aus dem angegebenen Element mit dem angegebenen Wert. Eine Ausnahme wird ausgelöst, wenn das Element fehlt oder das Textfeld nicht editierbar ist. Beispiel:
self . type ( "input#id_value" , "2012" )
Sie können auch self.add_text()
oder den WebDriver-Befehl .send_keys()
verwenden, aber diese leeren das Textfeld nicht zuerst, wenn sich darin bereits Text befindet.
? Den Text von einem Element auf einer Seite abrufen:
text = self . get_text ( "header h2" )
? Den Attributwert von einem Element auf einer Seite abrufen:
attribute = self . get_attribute ( "#comic img" , "title" )
? Existenz eines Elements auf einer Seite innerhalb einiger Sekunden bestätigen:
self . wait_for_element_present ( "div.my_class" , timeout = 10 )
(HINWEIS: Sie können auch Folgendes verwenden: self.assert_element_present(ELEMENT)
)
? Sichtbarkeit eines Elements auf einer Seite innerhalb einiger Sekunden sicherstellen:
self . wait_for_element_visible ( "a.my_class" , timeout = 5 )
(HINWEIS: Die Kurzversionen davon sind self.find_element(ELEMENT)
und self.assert_element(ELEMENT)
. Die find_element()
Version gibt das Element zurück.)
Da die obige Zeile das Element zurückgibt, können Sie es wie unten gezeigt mit .click()
kombinieren:
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™: Sie können Punkte verwenden, um Klassennamen (Beispiel: div.class_name
) als vereinfachte Version von div[class="class_name"]
innerhalb eines CSS-Selektors zu kennzeichnen.
Sie können *=
auch verwenden, um nach einem beliebigen Teilwert in einem CSS-Selektor zu suchen, wie unten gezeigt:
self . click ( 'a[name*="partial_name"]' )
? Sichtbarkeit von Text innerhalb eines Elements auf einer Seite innerhalb einiger Sekunden sicherstellen:
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 )
(HINWEIS: self.find_text(TEXT, ELEMENT)
und self.wait_for_text(TEXT, ELEMENT)
tun dies ebenfalls. Aus Gründen der Abwärtskompatibilität wurden ältere Methodennamen beibehalten, das Standardzeitlimit kann jedoch unterschiedlich sein.)
? Etwas behaupten:
self . assert_true ( var1 == var2 )
self . assert_false ( var1 == var2 )
self . assert_equal ( var1 , var2 )
? Nützliche bedingte Anweisungen: (mit kreativen Beispielen)
❓ is_element_visible(selector):
(sichtbar auf der Seite)
if self . is_element_visible ( 'div#warning' ):
print ( "Red Alert: Something bad might be happening!" )
❓ is_element_present(selector):
(im HTML vorhanden)
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):
(Text sichtbar auf Element)
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!" )
Wenn Ihr Test einen neuen Tab/ein neues Fenster öffnet, können Sie dorthin wechseln. (SeleniumBase wechselt automatisch zu neuen Tabs, die nicht für about:blank
-URLs geöffnet werden.)
self . switch_to_window ( 1 ) # This switches to the new tab (0 is the first one)
? Iframes folgen dem gleichen Prinzip wie neue Fenster: Sie müssen zunächst zum Iframe wechseln, wenn Sie dort Aktionen ausführen möchten:
self . switch_to_frame ( "iframe" )
# ... Now perform actions inside the iframe
self . switch_to_parent_frame () # Exit the current iframe
Um mehrere Iframes zu verlassen, verwenden Sie self.switch_to_default_content()
. (In einem einzelnen Iframe hat dies den gleichen Effekt wie 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
? Sie können auch einen Kontextmanager verwenden, um innerhalb von Iframes zu agieren:
with self . frame_switch ( "iframe" ):
# ... Now perform actions while inside the code block
# You have left the iframe
Dies funktioniert auch mit verschachtelten Iframes:
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 ist eine leistungsstarke JavaScript-Bibliothek, mit der Sie erweiterte Aktionen in einem Webbrowser ausführen können. Wenn auf der Webseite, auf der Sie sich befinden, jQuery bereits geladen ist, können Sie sofort mit der Ausführung von jQuery-Skripten beginnen. Sie wissen das, weil die Webseite im HTML etwa Folgendes enthalten würde:
< script src =" https://ajax.googleapis.com/ajax/libs/jquery/3.6.3/jquery.min.js " > </ script >
? Es ist in Ordnung, wenn Sie jQuery auf einer Seite verwenden möchten, auf der es noch nicht geladen ist. Führen Sie dazu zunächst den folgenden Befehl aus:
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
(Die meisten der oben genannten Befehle können direkt mit integrierten SeleniumBase-Methoden ausgeführt werden.)
❗ Einige Websites verfügen über eine restriktive Inhaltssicherheitsrichtlinie, um zu verhindern, dass Benutzer jQuery und andere externe Bibliotheken auf ihre Websites laden. Wenn Sie auf diesen Websites jQuery oder eine andere JS-Bibliothek verwenden müssen, fügen Sie --disable-csp
als pytest
-Befehlszeilenoption hinzu, um eine Chromium-Erweiterung zu laden, die den CSP umgeht.
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
(Aufgrund der großen Nachfrage wurde dieses Beispiel zur Traffic-Generierung in SeleniumBase mit den Methoden self.generate_referral(start_page, end_page)
und self.generate_traffic(start_page, end_page, loops)
aufgenommen.)
Angenommen, Sie möchten mehrere verschiedene Elemente auf einer Webseite in einem einzigen Test überprüfen, möchten aber nicht, dass der Test fehlschlägt, bis Sie mehrere Elemente gleichzeitig überprüft haben, damit Sie den Test nicht erneut ausführen müssen, um weitere fehlende Elemente zu finden Elemente auf derselben Seite. Hier kommen verzögerte Asserts ins Spiel. Hier ist ein Beispiel:
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()
und deferred_assert_text()
speichern alle Ausnahmen, die ausgelöst werden würden. Um alle fehlgeschlagenen verzögerten Asserts in einer einzigen Ausnahme auszuspülen, stellen Sie sicher, dass Sie self.process_deferred_asserts()
am Ende Ihrer Testmethode aufrufen. Wenn Ihr Test mehrere Seiten umfasst, können Sie self.process_deferred_asserts()
aufrufen, bevor Sie zu einer neuen Seite navigieren, damit der Screenshot aus Ihren Protokolldateien mit der URL übereinstimmt, unter der die verzögerten Asserts erstellt wurden.
Wenn Sie Zugriff auf Befehle benötigen, die im Standard-WebDriver enthalten sind, können Sie diese direkt wie folgt aufrufen:
self . driver . delete_all_cookies ()
capabilities = self . driver . capabilities
self . driver . find_elements ( "partial link text" , "GitHub" )
(Im Allgemeinen sollten Sie die SeleniumBase-Versionen der Methoden verwenden, sofern verfügbar.)
Sie können pytest --reruns=NUM
verwenden, um fehlgeschlagene Tests so oft zu wiederholen. Fügen Sie --reruns-delay=SECONDS
hinzu, um so viele Sekunden zwischen den Wiederholungsversuchen zu warten. Beispiel:
pytest --reruns=1 --reruns-delay=1
Sie können den Dekorator @retry_on_exception()
verwenden, um fehlgeschlagene Methoden erneut zu versuchen. (Erster Import: from seleniumbase import decorators
). Um mehr über SeleniumBase-Dekoratoren zu erfahren, klicken Sie hier.
„Erkennen Sie Fehler in der Qualitätssicherung, bevor Sie den Code in der Produktion bereitstellen!“