SeleniumBase MCP について
SeleniumBase MCPは、開発者やテストチーム向けのPython製ブラウザー自動化・スクレイピング・テストフレームワークです。CDP ModeではステルスオプションとCAPTCHA処理を利用できます。
主な機能
- 01CDP Modeによるブラウザー自動化
- 02ボット検知向けステルスオプション
- 03CAPTCHA処理
- 04ウェブスクレイピング
- 05pytestによるエンドツーエンドテスト
活用シーン
- 01ブラウザー操作の自動化
- 02ウェブページの一覧情報の取得
- 03pytestによるウェブアプリのテスト
MCP 対応
READMEにはSeleniumBase MCPへの言及とMCPへのリンクがありますが、MCPクライアントに公開する機能は説明されていません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
翻訳後に原文が更新されています。最新の内容は原文をご確認ください。
📊 SeleniumBase
ブラウザー自動化、Webスクレイピング、テストに対応する単一のフレームワーク。
🚀 開始 |
🏰 機能 |
🎛️ オプション |
📚 サンプル |
💻 スクリプト |
🗾 ロケール
📗 API |
📘 ステルス API |
🔠 デザインパターン |
🔴 レコーダー |
📊 ダッシュボード
🎖️ GUI |
📰 テストページ |
👤 UC モード |
🐙 CDP モード |
📶 グラフ |
🖥️ ファーム
👁️ 仕組み |
🚝 移行 |
🎭 ステルス Playwright |
🛂 MasterQA |
🚎 チュートリアル
🤖 MCP |
🟨 JS マネージャー |
🌏 翻訳 |
🎞️ プレゼンター |
🖼️ ビジュアル |
🗂️ ケースプラン
🥷 UC Mode と新しい CDP Mode により、自動化がボット対策サービスに検出されなくなります。CDP Mode は、さらに 標準の Playwright にステルス機能を追加します。
📚 "test" で始まる、または終わるサンプルスクリプトは、pytest で実行することを前提に作成されています。その他のスクリプトは、通常の python で直接実行します。(混同を避けるため、これらは "raw" で始まります。)
📝 Python スクリプトでPure CDP Mode(sb_cdp)を使用します:
(入力やクリック、Cloudflare Turnstile のバイパスなどの操作を実行します)
from seleniumbase import sb_cdp
sb = sb_cdp.Chrome(incognito=True)
sb.goto("https://www.planetminecraft.com/account")
sb.assert_element('input[name="login"]')
sb.type('input[name="email"]', "[email protected]")
sb.type('input[name="password"]', "Fake_Password")
sb.click("input#autologin") # The checkbox
if sb.is_element_visible("input[disabled]"):
sb.solve_captcha() # Enables the input
sb.assert_element_absent("input[disabled]")
sb.sleep(1.5)
sb.quit()
python raw_cdp_planetmc.py
✅ sb.solve_captcha()は、自動的にバイパスされない CAPTCHA を処理します。
(ページに CAPTCHA がないときに呼び出しても、何も起こりません/何もしません。)
ℹ️ sb.assert_* メソッドは、期待する条件が発生するまで最大 7 秒待機します。
📝 このスクリプトは Hacker News の一覧をスクレイピングします:
from seleniumbase import sb_cdp
sb = sb_cdp.Chrome(fast=True)
sb.goto("https://news.ycombinator.com/submitted?id=seleniumbase")
elements = sb.find_elements("span.titleline > a")
for element in elements:
print("* " + element.text)
python raw_cdp_yc_news.py
📝 このスクリプトは UC + CDP Mode で Cloudflare のチャレンジページをバイパスします:
from seleniumbase import SB
with SB(uc=True, test=True, locale="en") as sb:
sb.activate_cdp_mode()
sb.goto("https://gitlab.com/users/sign_in")
sb.sleep(2)
sb.solve_captcha()
sb.highlight('h1:contains("GitLab")')
sb.highlight('button:contains("Sign in")')
python raw_gitlab.py
🧪 エンドツーエンドテストの例は./examples/にあります。
🐙 ステルス CDP Mode の例は./examples/cdp_mode/にあります。
🎭 ステルス Playwright の例は./examples/cdp_mode/playwright/にあります。
🌐 対応する Chromium ブラウザーの CLI オプション
💡 コマンドラインパラメーターで使用する Chromium ブラウザーを設定できます:
python SCRIPT.py --chromium # Use the unbranded Chromium browser
python SCRIPT.py --cft # Use Chrome-for-testing
python SCRIPT.py --edge # Use Microsoft Edge
python SCRIPT.py --brave # Use Brave browser
デフォルトのブラウザーは Google Chrome です。システムにまだ存在しない場合、自動的にダウンロードされるのはブランド表示のない Chromium と Chrome-for-Testing のみです。
Chromium ブラウザーはメソッドの引数でも設定できます(例:cft=True、use_chromium=True、browser="edge"、browser="brave" など)。例:
sb = sb_cdp.Chrome(use_chromium=True)
⚙️ ステルスアーキテクチャのフローチャート:
🧪 pytestによる包括的な E2E テスト:
📝 このスクリプトはpytestで EC サイトをテストします:
from seleniumbase import BaseCase
BaseCase.main(__name__, __file__) # Call pytest
class MyTestClass(BaseCase):
def test_swag_labs(self):
self.goto("https://www.saucedemo.com")
self.type("#user-name", "standard_user")
self.type("#password", "secret_sauce\n")
self.assert_element("div.inventory_list")
self.click('button[name*="backpack"]')
self.click("#shopping_cart_container a")
self.assert_text("Backpack", "div.cart_item")
self.click("button#checkout")
self.type("input#first-name", "SeleniumBase")
self.type("input#last-name", "Automation")
self.type("input#postal-code", "77123")
self.click("input#continue")
self.click("button#finish")
self.assert_text("Thank you for your order!")
pytest test_get_swag.py
🥷 pytestでステルスを有効にするには、コマンドラインオプションに--ucを追加します。
📝 このスクリプトは、別の EC サイトをpytestでテストします:
from seleniumbase import BaseCase
BaseCase.main(__name__, __file__)
class CoffeeCartTest(BaseCase):
def test_coffee_cart(self):
self.goto("https://seleniumbase.io/coffee/")
self.assert_title("Coffee Cart")
self.assert_element('button:contains("Total: $0.00")')
self.click('div[data-sb="Cappuccino"]')
self.assert_exact_text("cart (1)", 'a[aria-label="Cart page"]')
self.click('div[data-sb="Flat-White"]')
self.assert_exact_text("cart (2)", 'a[aria-label="Cart page"]')
self.click('div[data-sb="Cafe-Latte"]')
self.assert_exact_text("cart (3)", 'a[aria-label="Cart page"]')
self.click('a[aria-label="Cart page"]')
self.assert_exact_text("Total: $53.00", "button.pay")
self.click("button.pay")
self.type("input#name", "Selenium Coffee")
self.type("input#email", "[email protected]")
self.click("button#submit-payment")
self.assert_text("Thanks for your purchase.", "#app .success")
pytest test_coffee_cart.py --demo
(
--demoモードではテストの速度が遅くなり、操作が強調表示されます)
📝 このスクリプトでは、pytest を使った複数の操作を扱います。
pytest test_demo_site.py
入力、クリック、選択、切り替え、ドラッグ&ドロップなどを簡単に行えます。
📚 ほかのスクリプトについては、SeleniumBase/examples/ フォルダーをご覧ください。
README を見る:
▶️ SeleniumBase は生の Selenium とどう違いますか?(クリックして展開)
💡 SeleniumBase は、ブラウザーの自動化とテストのための Python フレームワークです。SeleniumBase は Selenium/WebDriver API を使用し、pytest、pynose、behave などのテストランナーを組み込んで、整理された構造、テストの検出、テストの実行、テストの状態(例:成功、失敗、スキップ)、および既定の設定(例:ブラウザーの選択)を変更するコマンドラインオプションを提供します。生の Selenium では、コマンドラインからテストを設定するためのオプションパーサーを自分で用意する必要があります。
💡 SeleniumBase のドライバーマネージャーを使用すると、ドライバーの自動ダウンロードをより細かく制御できます。(バージョンを指定するには、pytest の実行コマンドで --driver-version=VER を使用します。)指定がない場合、SeleniumBase は既定で、メジャーなブラウザーのバージョンに一致するドライバーのバージョンをダウンロードします。
💡 SeleniumBase は CSS セレクターと XPath を自動的に判別するため、コマンドでセレクターの種類を指定する必要はありません(必要に応じて指定することもできます)。
💡 SeleniumBase のメソッドは、1 回のメソッド呼び出しで複数の操作を行うことがよくあります。たとえば、self.type(selector, text) は次の処理を行います。
1. 要素が表示されるまで待機します。
2. 要素が操作可能になるまで待機します。
3. テキストフィールドをクリアします。
4. 新しいテキストを入力します。
5. テキストが "\n" で終わる場合は、Enter/送信キーを押します。
生の 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/ フォルダーに保存します。標準の Selenium には、こうした機能が標準搭載されていません。
💡 SeleniumBase には、テスト実行用のデスクトップ GUI アプリが含まれています。たとえば、pytest 用の SeleniumBase Commander や、behave 用の SeleniumBase Behave 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.goto("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")
📘📝 raw_login_sb.py は、SB コンテキストマネージャーを使用します。純粋な python で実行します。(Selenium の標準の driver にアクセスするには、sb.driver を使用します。)
from seleniumbase import SB
with SB() as sb:
sb.goto("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")
📙📝 raw_login_driver.py は、Driver マネージャーを使用します。純粋な python で実行します。(この driver は、より多くのメソッドを備えた Selenium の標準の driver の改良版です。)
from seleniumbase import Driver
driver = Driver()
try:
driver.goto("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()
Python と Git のセットアップ:
🔵 Python と Git をシステムの PATH に追加してください。
🔵 Python 仮想環境の使用をおすすめします。
SeleniumBase のインストール:
🔵 pip を使って PyPI から seleniumbase をインストールする方法:
pip install seleniumbase
- (SeleniumBase をアップグレードするには、
--upgradeまたは-Uを追加します。) - (間接依存パッケージをアップグレードするには、
--force-reinstallを追加します。)
🔵 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" │
╰──────────────────────────────────────────────────╯
🔵 WebDriver のダウンロード:
✅ SeleniumBase は、必要に応じて chromedriver などの WebDriver を自動的にダウンロードします。
▶️ chromedriver のダウンロード時の出力例です。(クリックして展開)
*** Getting chromedriver 154.0.8037.57 (Latest Stable)
Downloading chromedriver-mac-arm64.zip from:
https://storage.googleapis.com/chrome-for-testing-public/154.0.8037.57/mac-arm64/chromedriver-mac-arm64.zip ...
Download Complete!
Extracting ['chromedriver'] from chromedriver-mac-arm64.zip ...
Unzip Complete!
The file [chromedriver] was saved to:
~/github/SeleniumBase/seleniumbase/drivers/
chromedriver
[chromedriver 154.0.8037.57] is 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.goto("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")
- ページ要素の検索には、デフォルトで CSS セレクター が使用されます。
- CSS セレクターを初めて使う方は、CSS Diner などのゲームで学習できます。
- さらに詳しく知りたい方は、CSS 属性セレクターの高度なガイドをご覧ください。
SeleniumBase の主なメソッド:
self.goto(url) # Navigate the browser window to the URL.
self.open(url) # Same as `self.goto(url)`
self.activate_cdp_mode() # Activate CDP Mode from UC Mode.
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、または純粋な python で実行できます。すべてのテストランナーがあらゆるテスト形式に対応しているわけではありません。たとえば、sb pytest フィクスチャを使用するテストは、pytest でのみ実行できます。(構文形式を参照してください。)Gherkin 形式のテストもあり、behave で実行できます。
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 のメソッドは、ページ要素の読み込みが完了してから操作するよう自動的に待機します(タイムアウト時間の上限まで)。
✅ SeleniumBase は、主要なすべてのブラウザーとオペレーティングシステムに対応しています。
ブラウザー:Chrome、Edge、Firefox、Safari。
システム:Linux/Ubuntu、macOS、Windows。
✅ SeleniumBase は、広く利用されているすべての CI/CD プラットフォームで動作します。
✅ SeleniumBase には、MasterQA という自動化と手動テストを組み合わせたソリューションが含まれており、手動テスターが検証を行う間に自動化を活用して手動テストを効率化できます。
✅ SeleniumBase は、オフラインでのテスト実行に対応しています(オンライン時に WebDriver をあらかじめダウンロードしていることが前提です)。
✅ SeleniumBase の機能一覧については、こちらをクリックしてください。
デモモード/デバッグ:
🔵 デモモードを使うと、テストの動作を確認できます。テストの進行が速すぎて目で追えない場合は、デモモードで実行すると、操作の間にブラウザーが一時停止し、操作対象のページ要素が強調表示され、アサーションが表示されます。
pytest my_first_test.py --demo
🔵 time.sleep(seconds) を使うと、指定した位置でテストを待機させることができます。
import time; time.sleep(3) # Do nothing for 3 seconds.
🔵 Python に組み込まれている pdb ライブラリを使ったデバッグモードで、テストをデバッグできます。
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".)
--opera # (Shortcut for "--browser=opera".)
--brave # (Shortcut for "--browser=brave".)
--comet # (Shortcut for "--browser=comet".)
--chromium # (Shortcut for using base `Chromium`)
--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.)
--fast # (Run the automation at full speed. May impact stealth.)
--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-sb-mgr # (A Recorder Mode that generates SB() context manager code.)
--rec-sb-cdp # (A Recorder Mode that generates Pure CDP Mode sb_cdp 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.)
--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
(設定には、デフォルトのタイムアウト値、二要素認証キー、DB 認証情報、S3 認証情報、その他テストで使用する重要な項目が含まれます。)
🔵 コマンドラインからテストに追加データを渡すには、--data="ANY STRING" を追加します。
テスト内では、self.data を使ってそのデータにアクセスできます。
ディレクトリ構成:
🔵 **`pytest`**でテストを実行する場合は、ルートフォルダーに**[pytest.ini](https://github.com/seleniumbase/SeleniumBase/blob/master/pytest.ini)**のコピーが必要です。**`pynose`**でテストを実行する場合は、ルートフォルダーに**[setup.cfg](https://github.com/seleniumbase/SeleniumBase/blob/master/setup.cfg)**のコピーが必要です。これらのファイルでは、テストのデフォルト設定を指定します。また、テストフォルダーには空の**[__init__.py](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/offline_examples/__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
プロのヒント™: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がまだ環境にインストールされていない場合にインストールできます。
プロのヒント™:--ghaを追加すると、デフォルト設定のGitHub Actions .ymlファイルを含めることができます。
ui_tests/
└── .github
└── workflows/
└── python-package.yml
失敗したテストのログファイル:
失敗するテストの例を試してみましょう。
""" 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.goto("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フォルダーに移動されます。既存のログをアーカイブしない場合は削除され、直近のテスト実行のログに置き換えられます。
SeleniumBase ダッシュボード:
🔵 pytestの--dashboardオプションを使うと、dashboard.htmlにSeleniumBase ダッシュボードが生成されます。このダッシュボードは、テストの実行と結果の生成に合わせて自動的に更新されます。例:
pytest --dashboard --rs --headless
🔵 さらに、任意のポートで独自のSeleniumBase ダッシュボードサーバーをホストすることもできます。Pythonのhttp.serverを使った例を示します。
python -m http.server 1948
🔵 これで、http://localhost:1948/dashboard.htmlにアクセスして、ダッシュボードをウェブアプリとして表示できます。この操作には、ターミナルウィンドウが2つ必要です。1つはサーバーの実行用、もう1つはテストの実行用で、テストは同じディレクトリから実行してください。(httpサーバーを停止するには、Ctrl+Cを使用します。)
🔵 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 Dashboard の使用を組み合わせると、Dashboard の円グラフが html レポートに追加されます。さらに、Dashboard も併用する際に html レポートの URL を Dashboard の URL と同じに設定すると(例: --dashboard --html=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 Dashboard とレポート:
(behave_bdd/ フォルダーは examples/ フォルダーにあります。)
behave behave_bdd/features/ -D dashboard -D headless
--junit を使用して、各 behave フィーチャーの .xml レポートを取得することもできます。Jenkins はこれらのファイルを使用して、テストのより良いレポートを表示できます。
behave behave_bdd/features/ --junit -D rs -D headless
🔵 Allure レポート:
参照: https://allurereport.org/docs/pytest/
SeleniumBase は allure-pytest をインストールされる依存関係に含めなくなりました。使用したい場合は、まずインストールしてください:
pip install allure-pytest
これで、テストで Allure の結果ファイルを作成できるようになり、Allure Reports で処理できます。
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
User-Agent の変更:
🔵 ブラウザーテスト (Chromium と Firefox のみ) の User-Agent を変更したい場合は、コマンドラインの引数として --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) などの一部のメソッドは、ページの readyState が complete になるまで待ってから処理を続行するために JavaScript を呼び出すので、ポップアップを自動的に閉じてしまう場合があります。この方法で閉じられたポップアップを承認しようとしている場合は、次の回避策を使ってください。代わりに self.find_element(SELECTOR).click() を呼び出すと(ポップアップが画面に表示されたままになります)、その後 self.accept_alert() でポップアップを承認できます(詳しくはこちら)。ポップアップが不定期に表示される場合は、コードを try/except ブロックで囲んでください。
ウェブサイトのガイドツアーの作成:
🔵 SeleniumBase のインタラクティブなウォークスルー(examples/tour_examples/ フォルダー)をご覧ください。ウェブサイトのオンボーディング体験のプロトタイプ作成に最適です。
本番環境と統合:
▶️ テスト用の本番環境を設定する方法をいくつか紹介します。(クリックして展開)
- Jenkins ビルドサーバーを設定して、定期的にテストを実行できます。ヘッドレスブラウザーの自動化を実際に利用している Jenkins の例については、Azure での SeleniumBase Jenkins の例またはGoogle Cloud での SeleniumBase Jenkins の例をご覧ください。
- Selenium Grid を使うと、複数のマシンにテストを分散し、並列実行することでテストを拡張できます。その方法については、SeleniumBase の selenium_grid フォルダーをご覧ください。ここには、始める際に役立つ Selenium Grid の ReadMe を含め、必要なものがすべて揃っています。
- サーバーマシンで実行したテストの結果を保存するためにSeleniumBase の MySQL 機能を使っている場合は、MySQL Workbench をインストールすると、DB の読み書きが簡単になります。
- AWS を使っている場合は、テストのログファイルやスクリーンショットを保存するために Amazon S3 アカウントを設定できます。この機能を有効にするには、S3 セクションの接続情報を指定して settings.py を編集し、テストの実行時にコマンドラインで
--with-s3-loggingを追加してください。
追加機能を有効にしてテストを実行する例を示します。
pytest [YOUR_TEST_FILE.py] --with-db-reporting --with-s3-logging
メソッドの詳細仕様と例:
🔵 ウェブページへの移動:(および関連コマンド)
self.goto("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.
プロのヒント™: 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")
プロのヒント™: 多くのウェブブラウザーでは、ページを右クリックして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!
プロのヒント™: CSSセレクター内では、ドットを使ってクラス名を指定できます(例:div.class_name)。これはdiv[class="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.goto("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内で操作するには、まず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が1つだけの場合、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スクリプトの実行方法:
jQuery は、ウェブブラウザーで高度な操作を実行できる強力な JavaScript ライブラリです。 現在開いているウェブページに jQuery がすでに読み込まれていれば、すぐに jQuery スクリプトを実行できます。 ウェブページの HTML に次のような内容が含まれていれば、読み込まれていることがわかります。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.3/jquery.min.js"></script>
🔵 まだ jQuery が読み込まれていないページで jQuery を使うこともできます。その場合は、まず次のコマンドを実行してください。
self.activate_jquery()
▶️ スクリプトで 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 の組み込みメソッドで直接実行できます。)
🔵 制限の厳しい CSP への対処方法:
❗ ウェブサイトによっては、ユーザーが jQuery やその他の外部ライブラリを読み込めないように、制限の厳しいコンテンツセキュリティポリシーを設定しています。そのようなウェブサイトで jQuery やほかの JS ライブラリを使用する必要がある場合は、pytest のコマンドラインオプションに --disable-csp を追加すると、CSP を回避する Chromium 拡張機能が読み込まれます。
🔵 JavaScript をさらに活用:
▶️ この例では、JavaScript でページに紹介ボタンを作成し、そのボタンをクリックします。(クリックして展開)
start_page = "https://xkcd.com/465/"
destination_page = "https://github.com/seleniumbase/SeleniumBase"
self.goto(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 に追加されています。)
🔵 遅延アサートの使用方法:
1 回のテストでウェブページ上の複数の異なる要素を検証したいものの、同じページにある不足要素を見つけるためにテストを再実行せずに済むよう、複数の要素をまとめて検証するまでテストを失敗させたくないとします。このような場合に遅延アサートを使用します。例を紹介します。
from seleniumbase import BaseCase
BaseCase.main(__name__, __file__)
class DeferredAssertTests(BaseCase):
def test_deferred_asserts(self):
self.goto("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 にアクセスする方法:
標準の 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 でバグを見つけましょう!」
まとめ
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。







