オールインワンのブラウザ自動化フレームワーク:
Web クローリング / テスト / スクレイピング / ステルス
開始 | ?特長 | ⁉️ オプション |例 | ?スクリプト |携帯
API | ?フォーマット | ?レコーダー |ダッシュボード | ?ロケール |農場
⁉️ GUI | ?テストページ | ? UCモード | ? CDP モード | ?チャート |グリッド
⁉️どうやって | ?移行 |ケースプラン | ♻️ テンプレート | ?ハイブリッド | ?ツアー
? CI/CD | ⁉️JSMgr | ?翻訳者 |プレゼンター | ?ダイアログ | ⁉️ビジュアル
SeleniumBase は、Web 自動化アクティビティのためのプロフェッショナル ツールキットです。 Web サイトのテスト、CAPTCHA のバイパス、生産性の向上、タスクの完了、ビジネスの拡大を目的として構築されています。
SeleniumBase/examples/フォルダーにある200 を超える例から学習してください。
? SeleniumBase UC モード(ステルス モード) には独自の ReadMe があることに注意してください。
? Seleniumbase CDP モードには独自の個別の ReadMe があることにも注意してください。
スクリプトはpython
経由で呼び出すことができますが、一部の構文形式ではpytest (テストを自動的に検出、収集、実行できる SeleniumBase に含まれる Python 単体テスト フレームワーク) を想定しています。
?これは、ログイン、ショッピング、チェックアウトをテストする my_first_test.py です。
pytest my_first_test.py
pytest
別の設定をしない限り、デフォルトで--chrome
使用します。
?電子商取引サイトを検証する test_coffee_cart.py は次のとおりです。
pytest test_coffee_cart.py --demo
(
--demo
モードではテストが遅くなり、アクションが強調表示されます)
?これは、いくつかのアクションをカバーする test_demo_site.py です。
pytest test_demo_site.py
入力、クリック、選択、切り替え、ドラッグ アンド ドロップなどが簡単に行えます。
(その他の例については、SeleniumBase/examples/ フォルダーを参照してください。)
README を確認してください。
- 始める/インストール
- 基本的な例・使い方
- 一般的なテスト方法
- 豆知識 / 詳細はこちら
- デモモード/デバッグ
- コマンドラインオプション
- ディレクトリ構成
- SeleniumBase ダッシュボード
- テストレポートの生成
SeleniumBase は、ブラウザの自動化とテストのための Python フレームワークです。 SeleniumBase は Selenium/WebDriver API を使用し、 pytest
、 pynose
などのテスト ランナーをbehave
、体系化された構造、テスト検出、テスト実行、テスト状態 (例: pass、failed、skipped )、および変更のためのコマンド ライン オプションを提供するために動作します。デフォルト設定 (例: ブラウザの選択)。生の Selenium では、コマンドラインからテストを構成するために独自のオプション パーサーをセットアップする必要があります。
SeleniumBase のドライバー マネージャーを使用すると、ドライバーの自動ダウンロードをより詳細に制御できます。 (バージョンを指定するには、 pytest
実行コマンドで--driver-version=VER
を使用します。) デフォルトでは、SeleniumBase は、メジャー ブラウザのバージョンが設定されていない場合、一致するドライバー バージョンをダウンロードします。
SeleniumBase は CSS セレクターと XPath の間を自動的に検出します。つまり、コマンドでセレクターの種類を指定する必要はありません (ただし、オプションで指定することもできます)。
SeleniumBase メソッドは、多くの場合、1 つのメソッド呼び出しで複数のアクションを実行します。たとえば、 self.type(selector, text)
次のことを行います。
1. 要素が表示されるまで待機します。
2. 要素が対話型になるまで待機します。
3. テキストフィールドをクリアします。
4. 新しいテキストを入力します。
5. テキストが"n"
で終わる場合は、Enter/Submit を押します。
生の Selenium では、これらのアクションには複数のメソッド呼び出しが必要です。
SeleniumBase は、設定されていない場合はデフォルトのタイムアウト値を使用します。
✅ self.click("button")
生の Selenium では、要素の読み込みにさらに時間が必要な場合、メソッドは (デフォルトで) 即座に失敗します。
self.driver.find_element(by="css selector", value="button").click()
(信頼できるコードは、信頼できないコードよりも優れています。)
SeleniumBase を使用すると、メソッドの明示的なタイムアウト値を変更できます。
✅ self.click("button", timeout=10)
生の Selenium では、さらに多くのコードが必要になります。
WebDriverWait(driver, 10).until(EC.element_to_be_clickable("css selector", "button")).click()
(複雑なコードよりも単純なコードの方が優れています。)
SeleniumBase は、テストが失敗した場合にクリーンなエラー出力を提供します。生の Selenium では、エラー メッセージが非常に煩雑になる可能性があります。
SeleniumBase には、テスト用のダッシュボードとレポートを生成するオプションが用意されています。また、失敗したテストのスクリーンショットも./latest_logs/
フォルダーに保存されます。 Raw Selenium には、そのままではこれらのオプションがありません。
SeleniumBase には、 pytest
の SeleniumBase Commander やbehave
の SeleniumBase Behave GUI など、テストを実行するためのデスクトップ GUI アプリが含まれています。
SeleniumBase には、ブラウザーの手動アクションからテストを作成するための独自のレコーダー/テスト ジェネレーターがあります。
SeleniumBase には、テストとステップの説明を整理するためのテスト ケース管理ソフトウェア (「CasePlans」) が付属しています。
SeleniumBase には、Python から JavaScript を生成できるデータ アプリ (「ChartMaker」) を構築するためのツールが含まれています。
テストを作成するさまざまな方法について学びます。
これは test_simple_login.py です。これはBaseCase
クラスの継承を使用し、pytest または pynose で実行されます。 (Selenium の生のdriver
にアクセスするにはself.driver
を使用します。)
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" )
?これはsb
pytest
フィクスチャを使用する sb_fixture_tests.py のテストです。 pytestで実行します。 (Selenium の生のdriver
にアクセスするには、 sb.driver
を使用します。)
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" )
?これは、 SB
Context Manager を使用する raw_login_sb.py です。純粋なpython
で実行されます。 (Selenium の生のdriver
にアクセスするには、 sb.driver
を使用します。)
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" )
?これは、 DriverContext
Manager を使用する raw_login_context.py です。純粋なpython
で実行されます。 ( driver
、Selenium の raw driver
の改良版であり、メソッドが追加されています。)
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" )
?これは、 Driver
マネージャーを使用する raw_login_driver.py です。純粋なpython
で実行されます。 ( driver
、Selenium の raw driver
の改良版であり、メソッドが追加されています。)
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 ()
これは、behave-BDD Gherkin 構文を使用する login_app.feature です。 behave
で実行されます。 ( SeleniumBase の動作と BDD の統合について学習します)
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"
? PythonとGit をシステム PATH に追加します。
? Python 仮想環境の使用をお勧めします。
PyPI または GitHub からseleniumbase
インストールできます。
? PyPI からseleniumbase
をインストールする方法:
pip install seleniumbase
--upgrade
または-U
を追加します。)--force-reinstall
を追加します。)pip3
使用します。) ? GitHub クローンからseleniumbase
インストールする方法:
git clone https://github.com/seleniumbase/SeleniumBase.git
cd SeleniumBase/
pip install -e .
? GitHub クローンから既存のインストールをアップグレードする方法:
git pull
pip install -e .
? seleniumbase
またはsbase
と入力して、SeleniumBase が正常にインストールされたことを確認します。
___ _ _ ___
/ __ | ___ | | ___ _ _ (_)_ _ _ __ | _ ) __ _ ______
_ _ / -_) / -_) ' | | | | ' | _ / _ ` (_- < -_)
| ___/ _ __ | _ _ __ | _ || _ | _ | _ ,_ | _ | _ | _ | ___/ _ _,_/__ | ___ |
----------------------------------------------------
╭──────────────────────────────────────────────────╮
│ * 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 は、必要に応じてchromedriver
などの Web ドライバーを自動的にダウンロードします。
*** 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 !
? SeleniumBase のクローンを作成した場合は、examples/ フォルダーからテストを実行できます。
my_first_test.py は次のとおりです。
cd examples/
pytest my_first_test.py
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.
? SeleniumBase メソッドの完全なリストについては、 「メソッドの概要」を参照してください。
✅ SeleniumBase は、テスト前の Web ブラウザの起動、失敗時のスクリーンショットの保存、テスト後の Web ブラウザの終了など、一般的な WebDriver アクションを自動的に処理します。
✅ SeleniumBase を使用すると、コマンドライン オプションを使用してテストをカスタマイズできます。
✅ SeleniumBase はコマンドに単純な構文を使用します。例:
self . type ( "input" , "dogs n " ) # (The "n" presses ENTER)
ほとんどの SeleniumBase スクリプトはpytest
、 pynose
、または pure python
で実行できます。すべてのテスト ランナーがすべてのテスト形式を実行できるわけではありません。たとえば、 sb
pytest フィクスチャを使用するテストは、 pytest
でのみ実行できます。 (「構文形式」を参照) behave で実行される Gherkin テスト形式もあります。
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
は自動テスト検出が含まれています。実行する特定のファイルまたはフォルダーを指定しない場合、 pytest
、次の基準に基づいて、実行するテストのすべてのサブディレクトリを自動的に検索します。
test_
で始まるか_test.py
で終わる Python ファイル。test_
で始まる Python メソッド。 SeleniumBase pytest.ini ファイルが存在すると、デフォルトの検出設定を変更できます。 seleniumbase.BaseCase
自動検出をトリガーするためにunittest.TestCase
を継承するため、Python クラス名は任意の名前にすることができます。
✅ 実際の実行前に、プリフライト チェックを実行して、どのテストがpytest
によって検出されるかを確認できます。
pytest --co -q
✅ ファイルに対してpytest
またはpynose
呼び出すときに、より具体的に指定できます。
pytest [FILE_NAME.py]::[CLASS_NAME]::[METHOD_NAME]
pynose [FILE_NAME.py]:[CLASS_NAME].[METHOD_NAME]
✅ 不安定なテストはもう必要ありません。 SeleniumBase メソッドは、ページ要素と対話する前に、ページ要素の読み込みが完了するまで自動的に待機します (タイムアウト制限まで)。これは、スクリプト内にランダムなtime.sleep()
ステートメントが必要なくなることを意味します。
✅ SeleniumBase は、すべての主要なブラウザとオペレーティング システムをサポートします。
ブラウザ: Chrome、Edge、Firefox、Safari。
システム: Linux/Ubuntu、macOS、および Windows。
✅ SeleniumBase は、すべての一般的な CI/CD プラットフォームで動作します。
✅ SeleniumBase には、手動テスターが検証を処理しながら、自動化によって手動テストを高速化する、 MasterQAと呼ばれる自動/手動ハイブリッド ソリューションが含まれています。
✅ SeleniumBase は、オフラインでのテストの実行をサポートしています (オンライン時に Web ドライバーが事前にダウンロードされていると仮定します)。
✅ SeleniumBase の機能の完全なリストについては、ここをクリックしてください。
?デモ モードは、テストが何を行っているかを確認するのに役立ちます。テストの動きが速すぎて目に見えない場合は、デモ モードでテストを実行して、アクション間でブラウザを一時停止し、アクション中のページ要素を強調表示して、アサーションを表示します。
pytest my_first_test.py --demo
? time.sleep(seconds)
使用すると、テストを特定の場所で待機させることができます。
import time ; time . sleep ( 3 ) # Do nothing for 3 seconds.
? Python の組み込みpdbライブラリを使用したデバッグ モードは、テストのデバッグに役立ちます。
import pdb ; pdb . set_trace ()
import pytest ; pytest . set_trace ()
breakpoint () # Shortcut for "import pdb; pdb.set_trace()"
(
pdb
コマンド:n
、c
、s
、u
、d
=>next
、continue
、step
、up
、down
)
?例外またはエラーをスローするアクティブなテストを一時停止するには (コンソールでデバッグ モードが開始される間、ブラウザ ウィンドウを開いたままにしておきます)、 pytest
オプションとして--pdb
追加します。
pytest test_fail.py --pdb
?デバッグ モードでテストを開始するには、 pytest
オプションとして--trace
を追加します。
pytest test_coffee_cart.py --trace
✅ 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 は、テスト用の追加のpytest
コマンドライン オプションを提供します。
--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.)
(コマンド ライン オプション定義の完全なリストについては、こちらを参照してください。コマンド ライン オプションの詳細な例については、 customizing_test_runs.mdを参照してください)。
?テストが失敗すると、最新のテスト実行のログとスクリーンショットがlatest_logs/
フォルダーに保存されます。コマンドライン オプションに --archive_logs を追加するか、settings.py でARCHIVE_EXISTING_LOGS
True に設定すると、これらのログはarchived_logs/
に移動されます。それ以外の場合、ログ ファイルは次回のテスト実行の開始時にクリーンアップされます。 test_suite.py
コレクションには、ロギングがどのように機能するかを確認できるように、意図的に失敗するテストが含まれています。
cd examples/
pytest test_suite.py --chrome
pytest test_suite.py --firefox
seleniumbase/config/settings.py をオーバーライドする簡単な方法は、カスタム設定ファイルを使用することです。テストに追加するコマンドライン オプションは次のとおりです: (examples/custom_settings.py を参照) --settings_file=custom_settings.py
(設定には、デフォルトのタイムアウト値、2 要素認証キー、DB 認証情報、S3 認証情報、その他の重要な設定が含まれます)テストで使用されます。)
?追加のデータをコマンドラインからテストに渡すには、 --data="ANY STRING"
を追加します。テスト内では、 self.data
使用してそれにアクセスできます。
? pytest
を使用してテストを実行する場合は、ルート フォルダーにpytest.iniのコピーが必要になります。 pynose
を使用してテストを実行する場合は、ルート フォルダーにsetup.cfgのコピーが必要になります。これらのファイルは、テストのデフォルト構成の詳細を指定します。テスト ファイルがそのフォルダーから他のファイルをインポートできるように、テスト フォルダーには空のinit .pyファイルも含める必要があります。
? sbase mkdir DIR
構成ファイルとサンプル テストを含むフォルダーを作成します。
sbase mkdir ui_tests
その新しいフォルダーには次のファイルが含まれます。
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™: sbase mkdir
コマンドに-b
または--basic
追加することで、サンプル テストを含まないボイラープレート フォルダーを作成することもできます。
sbase mkdir ui_tests --basic
その新しいフォルダーには次のファイルが含まれます。
ui_tests/
├── __init__.py
├── pytest.ini
├── requirements.txt
└── setup.cfg
これらのファイルのうち、 pytest.ini
構成ファイルが最も重要で、次に空の__init__.py
ファイルが続きます。 setup.cfg
ファイル (pynose 用) もあります。最後に、 requirements.txt
ファイルを使用すると、seleniumbase を環境にインストールすることができます (まだインストールされていない場合)。
失敗したテストの例を試してみましょう。
""" 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
次のように、 examples/
フォルダーから実行できます。
pytest test_fail.py
?失敗したテストに関する情報とスクリーンショットを保持するために、ログ フォルダー「latest_logs」が作成されたことがわかります。 settings.py で ARCHIVE_EXISTING_LOGS を True に設定している場合、または--archive-logs
を使用してテストを実行している場合は、テストの実行中に過去の結果が archived_logs フォルダーに移動されます。既存のログをアーカイブしないことを選択した場合、既存のログは削除され、最新のテスト実行のログに置き換えられます。
? pytest の--dashboard
オプションはdashboard.html
にある SeleniumBase ダッシュボードを生成します。このダッシュボードは、テストが実行されて結果が生成されると自動的に更新されます。例:
pytest --dashboard --rs --headless
?さらに、選択したポートで独自の SeleniumBase ダッシュボード サーバーをホストできます。以下は、Python のhttp.server
を使用した例です。
python -m http.server 1948
?これで、 http://localhost:1948/dashboard.html
に移動して、ダッシュボードを Web アプリとして表示できるようになります。これには 2 つの異なるターミナル ウィンドウが必要です。1 つはサーバーの実行用で、もう 1 つはテストの実行用であり、同じディレクトリから実行する必要があります。 ( Ctrl+C を使用して http サーバーを停止します。)
? SeleniumBase ダッシュボードの完全な例を次に示します。
pytest test_suite.py test_image_saving.py --dashboard --rs --headless
pytest
HTML レポート: ✅ --html=report.html
使用すると、テスト スイートの完了後に指定された名前の豪華なレポートが得られます。
pytest test_suite.py --html=report.html
✅ pytest HTML レポートを SeleniumBase ダッシュボードの使用法と組み合わせると、ダッシュボードの円グラフが HTML レポートに追加されます。さらに、ダッシュボードも使用するときに HTML レポート URL をダッシュボード URL と同じに設定すると (例: --dashboard --html=dashboard.html
)、ダッシュボードは、すべてのテストが完了しました。
✅ アップグレードされた HTML レポートの例を次に示します。
pytest test_suite.py --dashboard --html=report.html
Jenkins で pytest HTML レポートを表示する場合、HTML が正しく表示されるように Jenkins 設定を構成する必要がある場合があります。これは、Jenkins CSP の変更によるものです。
代わりに--junit-xml=report.xml
使用して XML レポートを取得することもできます。 Jenkins はこのファイルを使用して、テストのレポートをより適切に表示できます。
pytest test_suite.py --junit-xml=report.xml
pynose
レポート: --report
オプションを使用すると、テスト スイートの完了後に豪華なレポートが作成されます。
pynose test_suite.py --report
(注: --show-report
を追加すると、テスト スイートの完了後にすぐに Pynose レポートを表示できます。テストの実行が一時停止されるため、ローカルでテストを実行する場合にのみ--show-report
使用してください。)
behave
ダッシュボードとレポート:(behave_bdd/ フォルダーは、examples/ フォルダー内にあります。)
behave behave_bdd/features/ -D dashboard -D headless
--junit
使用して、各behave
機能の.xml
レポートを取得することもできます。 Jenkins はこれらのファイルを使用して、テストのレポートをより適切に表示できます。
behave behave_bdd/features/ --junit -D rs -D headless
参照: https://allurereport.org/docs/pytest/
SeleniumBase には、インストールされる依存関係の一部としてallure-pytest
が含まれなくなりました。使用したい場合は、まずインストールしてください。
pip install allure-pytest
これで、テストで Allure 結果ファイルを作成し、Allure レポートで処理できるようになりました。
pytest test_suite.py --alluredir=allure_results
ブラウザーのテスト (Chromium または Firefox) にプロキシ サーバーを使用したい場合は、コマンド ラインの引数として--proxy=IP_ADDRESS:PORT
を追加できます。
pytest proxy_test.py --proxy=IP_ADDRESS:PORT
使用するプロキシ サーバーで認証が必要な場合は、次の操作を行うことができます (Chromium のみ)。
pytest proxy_test.py --proxy=USERNAME:PASSWORD@IP_ADDRESS:PORT
SeleniumBase は SOCKS4 および SOCKS5 プロキシもサポートしています。
pytest proxy_test.py --proxy= " socks4://IP_ADDRESS:PORT "
pytest proxy_test.py --proxy= " socks5://IP_ADDRESS:PORT "
作業を簡単にするために、頻繁に使用するプロキシを proxy_list.py の PROXY_LIST に追加し、 --proxy=KEY_FROM_PROXY_LIST
を使用してそのキーの IP_ADDRESS:PORT を使用できます。
pytest proxy_test.py --proxy=proxy1
?ブラウザー テスト用のユーザー エージェントを変更する場合 (Chromium と Firefox のみ)、コマンド ラインの引数として--agent="USER AGENT STRING"
を追加できます。
pytest user_agent_test.py --agent= " Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1.7412.EU "
? self.accept_alert()
、アラート ポップアップを自動的に待機して受け入れます。 self.dismiss_alert()
、アラート ポップアップを自動的に待機して閉じます。 self.click(SELECTOR)
などの一部のメソッドは、続行する前に JavaScript を呼び出してページのreadyState
がcomplete
ことを確認するため、ポップアップを自動的に閉じることがあります。この方法で閉じられたポップアップを受け入れようとしている場合は、次の回避策を使用してください。代わりにself.find_element(SELECTOR).click()
を呼び出します (これにより、ポップアップが画面上に残るようになります)。 self.accept_alert()
を使用してポップアップを受け入れます (詳細はこちら)。ポップアップが断続的に表示される場合は、コードを try/excel ブロックで囲みます。
? SeleniumBase インタラクティブ ウォークスルー ( examples/tour_examples/
フォルダー内) について学習します。これは、Web サイトのオンボーディング エクスペリエンスのプロトタイプを作成するのに最適です。
--with-s3-logging
を追加します。いくつかの追加機能を有効にしてテストを実行する例を次に示します。
pytest [YOUR_TEST_FILE.py] --with-db-reporting --with-s3-logging
? Web ページへの移動: (および関連コマンド)
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™: self.get_page_source()
メソッドと Python のfind()
コマンドを使用して、HTML を解析して特定のものを見つけることができます。 (さらに高度な解析については、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 ]
?クリック:
ページ上の要素をクリックするには:
self . click ( "div#my_id" )
ProTip™:ほとんどの Web ブラウザーでは、ページを右クリックしてInspect Element
を選択すると、独自のスクリプトを作成するために必要な CSS セレクターの詳細を表示できます。
?テキストの入力:
self.type(selector, text)
# 指定された要素のテキストを指定された値で更新します。要素が見つからない場合、またはテキスト フィールドが編集できない場合は、例外が発生します。例:
self . type ( "input#id_value" , "2012" )
self.add_text()
または WebDriver .send_keys()
コマンドを使用することもできますが、テキスト ボックス内に既にテキストがある場合、これらのコマンドではテキスト ボックスが最初にクリアされません。
?ページ上の要素からテキストを取得します。
text = self . get_text ( "header h2" )
?ページ上の要素から属性値を取得します。
attribute = self . get_attribute ( "#comic img" , "title" )
?一定の秒数以内にページ上の要素の存在をアサートします。
self . wait_for_element_present ( "div.my_class" , timeout = 10 )
(注: self.assert_element_present(ELEMENT)
も使用できます)
?一定の秒数以内にページ上の要素の可視性をアサートします。
self . wait_for_element_visible ( "a.my_class" , timeout = 5 )
(注: その短いバージョンはself.find_element(ELEMENT)
とself.assert_element(ELEMENT)
です。 find_element()
バージョンは要素を返します。)
上の行は要素を返すので、以下に示すようにそれを.click()
と組み合わせることができます。
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™: CSS セレクター内でドットを使用してdiv[class="class_name"]
の簡易バージョンとしてクラス名 (例: div.class_name
) を示すことができます。
以下に示すように、 *=
使用して CSS セレクター内の部分的な値を検索することもできます。
self . click ( 'a[name*="partial_name"]' )
?数秒以内にページ上の要素内のテキストの可視性をアサートします。
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 )
(注: self.find_text(TEXT, ELEMENT)
およびself.wait_for_text(TEXT, ELEMENT)
もこれを行います。下位互換性のために、古いメソッド名が保持されていますが、デフォルトのタイムアウトは異なる場合があります。)
?何かをアサートする:
self . assert_true ( var1 == var2 )
self . assert_false ( var1 == var2 )
self . assert_equal ( var1 , var2 )
?便利な条件文: (クリエイティブな例付き)
❓ is_element_visible(selector):
(ページ上に表示されます)
if self . is_element_visible ( 'div#warning' ):
print ( "Red Alert: Something bad might be happening!" )
❓ is_element_present(selector):
(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):
(要素上に表示されるテキスト)
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!" )
テストで新しいタブ/ウィンドウが開いた場合は、それに切り替えることができます。 (SeleniumBase はabout:blank
URL を開かない新しいタブに自動的に切り替えます。)
self . switch_to_window ( 1 ) # This switches to the new tab (0 is the first one)
? iframe は新しいウィンドウと同じ原則に従います。iframe でアクションを実行したい場合は、まず iframe に切り替える必要があります。
self . switch_to_frame ( "iframe" )
# ... Now perform actions inside the iframe
self . switch_to_parent_frame () # Exit the current iframe
複数の iframe を終了するには、 self.switch_to_default_content()
を使用します。 (単一の iframe 内の場合、これは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
?コンテキスト マネージャーを使用して iframe 内で動作することもできます。
with self . frame_switch ( "iframe" ):
# ... Now perform actions while inside the code block
# You have left the iframe
これはネストされた iframe でも機能します。
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 は、Web ブラウザーで高度なアクションを実行できる強力な JavaScript ライブラリです。閲覧している Web ページにすでに jQuery がロードされている場合は、すぐに jQuery スクリプトの実行を開始できます。これは、Web ページの HTML に次のような内容が含まれるため、わかります。
< script src =" https://ajax.googleapis.com/ajax/libs/jquery/3.6.3/jquery.min.js " > </ script >
?まだロードされていないページで jQuery を使用したい場合は問題ありません。これを行うには、まず次のコマンドを実行します。
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
(上記のコマンドのほとんどは、組み込みの SeleniumBase メソッドを使用して直接実行できます。)
❗ 一部の Web サイトには、ユーザーが jQuery やその他の外部ライブラリを Web サイトにロードできないようにするために、制限的なコンテンツ セキュリティ ポリシーが適用されています。これらの Web サイトで jQuery または別の JS ライブラリを使用する必要がある場合は、 pytest
コマンドライン オプションとして--disable-csp
追加して、CSP をバイパスする Chromium 拡張機能をロードします。
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
(ご要望が多かったので、このトラフィック生成例はself.generate_referral(start_page, end_page)
メソッドとself.generate_traffic(start_page, end_page, loops)
メソッドとともに SeleniumBase に組み込まれました。)
Web ページ上の複数の異なる要素を 1 回のテストで検証したいが、欠落している要素をさらに見つけるためにテストを再実行する必要がないように、複数の要素を一度に検証するまでテストが失敗することは望ましくないとしましょう。同じページ上の要素。ここで、遅延アサートが登場します。例を次に示します。
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()
とdeferred_assert_text()
は、発生する例外を保存します。失敗した遅延アサートをすべて 1 つの例外にフラッシュするには、テスト メソッドの最後でself.process_deferred_asserts()
を必ず呼び出してください。テストが複数のページにヒットした場合は、新しいページに移動する前にself.process_deferred_asserts()
を呼び出して、ログ ファイルのスクリーンショットが遅延アサートが行われた URL と一致するようにすることができます。
標準の WebDriver に付属するコマンドにアクセスする必要がある場合は、次のように直接呼び出すことができます。
self . driver . delete_all_cookies ()
capabilities = self . driver . capabilities
self . driver . find_elements ( "partial link text" , "GitHub" )
(一般に、利用可能な場合は SeleniumBase バージョンのメソッドを使用することをお勧めします。)
pytest --reruns=NUM
使用すると、失敗したテストを何回でも再試行できます。 --reruns-delay=SECONDS
を追加すると、再試行の間にその秒数を待機します。例:
pytest --reruns=1 --reruns-delay=1
@retry_on_exception()
デコレータを使用して、失敗したメソッドを再試行できます。 (最初のインポート: from seleniumbase import decorators
)。 SeleniumBase デコレータの詳細については、ここをクリックしてください。
「コードを運用環境にデプロイする前に、QA でバグを見つけてください。」