Seleneは、PythonでブラウザUIテストを作成するための簡潔で強力なライブラリです。 Java Worldの人気のあるSelenideプロジェクトのPythonicポートとして構築されました。 Seleneは、開発者が一般的な英語で「話す」読みやすく保守可能なテストを作成するのを支援し、チーム全体で理解しやすく共有しやすくなります。
Seleneのコア強度は、ユーザー指向のAPIであり、Selenium WebDriverを使用することの複雑さを抽象化します。テストは、シンプルで表現力豊かな構文と、怠zyな評価要素、Ajaxのような負荷をよりスマートに暗黙的に待つための自動再試行メカニズムなどのサポート機能を使用して作成できます。 PageObjectサポートが組み込まれているため、ウィジェットを介してWeb要素の再利用性が可能になります。
By.* Tupleのようなロケーターを介して要素を構成するPageObjectsを構築でき、さまざまなコンポーネントに再利用可能な要素を作成できます。ActionChainsを使用してカスタムコマンドを作成する必要性を減らします。Seleneは現在、2つの主要なバージョンをサポートしています。
最新の推奨プレリリースバージョン(V2.0.0RC9) :
3.8+>=4.12.0安定バージョン(v1.0.2) :
2.7, 3.5, 3.6, 3.7<4.0.0v1.xからv2.xへの移行については、移行ガイドに従ってください。
1.0.2から2.0.0rc<LATEST> :
2.0.0rc<LATEST>に更新しますcollection.first()メソッドを.first()から.firstに置き換えますtext('foo')などのすべての条件have.*確認してくださいbe.*移行中の潜在的なリファクタリングの例:
(text('foo')) to (have.text('foo'))(visible)から(be.visible).should(x, timeout=y) .with_(timeout=y).should(x).should_not(be.*) .should(be.not_.*) )to .should(be.*.not_).should_not(have.*) .should(have.no.*) .should(have.*.not_).should_each(condition) to .should(condition.each)from selene import be, have Python 3.8+が必要です。
Pyenvがインストールされていることを考えると、Pythonの必要なバージョンをインストールするのは簡単です。
$ pyenv install 3.8.13
$ pyenv global 3.8.13
$ python -V
Python 3.8.13詩とpyenvがインストールされていることを確認してください。
poetry new my-tests-with-selene
cd my-tests-with-selene
pyenv local 3.8.13
poetry add selene --allow-prereleases # for pre-release version
poetry installプレリリースバージョン(新しいプロジェクトに推奨)の場合:
pip install selene --pre最新の安定バージョンの場合:
pip install seleneソースコードからSeleneを直接インストールすることを希望する場合:
git clone https://github.com/yashaka/selene.git
cd selene
python setup.py installまたは詩の使用:
poetry add git+https://github.com/yashaka/selene.gitまたはPIPの使用:
pip install git+https://github.com/yashaka/selene.gitSeleneを使用して簡単なGoogle検索を自動化します。
from selene import browser , be , have
browser . open ( 'https://google.com/ncr' )
browser . element ( '[name=q]' ). should ( be . blank )
. type ( 'selenium' ). press_enter ()
browser . all ( '#rso>div' ). should ( have . size_greater_than ( 5 ))
. first . should ( have . text ( 'Selenium automates browsers' ))
# not mandatory, because will be closed automatically:
# browser.quit() Seleneは、 be 、 have 、 byのモジュールを使用して、Web要素と対話するための直感的なAPIを提供します。
怠zyでダイナミックな要素:セレネの要素は怠zyでダイナミックです。つまり、アクションが実行されるたびに配置されます。これにより、最新の要素との相互作用が保証されます。
これが基本的な要素の相互作用です:
from selene import browser , by , be
# because elements are "lazy",
# you can store them in variable:
search_box = browser . element ( by . name ( 'q' ))
# – even before the actual page will be loaded:
browser . open ( 'https://google.com/ncr' )
search_box . should ( be . blank ). type ( 'Selenium' ). press_enter ()正しい要素ロケーターを選択することは、信頼できるテストに重要です。ここにいくつかのヒントがあります:
要素の検査: Web要素を右クリックし、[検査]を選択して、ブラウザの開発者ツールでHTMLを表示します。
一意の属性を使用する:セレクターで使用するID、名前、カスタム属性などの一意の属性を探します。ベストプラクティスはdata-test-idなどのテストニーズに特に特にdata-*属性を使用することで開発者と交渉することです。
CSSまたはXPathセレクターを構築します。要素を一意に識別するセレクターを構築します。たとえば、consciser css-selectors #elementId 、 .className 、または[name="q"]を使用するか、cssが処理できないものにxpathを使用してください: //*[text()="Submit"]/.. ..。 Seleneは、CSSまたはXPathセレクターを提供するかどうかを自動的に検出します。
Seleneのセレクターヘルパーを利用(オプション):ほとんどの人間読み取り可能なコードが必要な場合は、 by.name('q') 、 by.text('Submit') 、 by.*ヘルパーを使用できます。 KISS原則の目的のために、 [name=q] by.name('q')のような生のCSSセレクターを好むことに注意してください。
読みやすさと保守性を高めるために長いセレクターをより小さな部品に分解します: browser.element('//*[@role="row" and contains(.,"Jon")]//*[@data-field="select-row"]') browser.all('[role=row]').element_by(have.text('Jon')).element('[data-field=select-row]')以下のセレクターは、潜在的な障害の各理由を再確認する必要があります。
カスタムセレクター戦略を作成する(オプション):フロントエンド開発者がベストプラクティスに従い、テストでカバーする必要があるすべての要素にdata-test-id属性を使用してください。そのような要素がsnake_case_or-kebab-case-wordsであるための命名規則があります。 Seleneのbrowser.config.selector_to_by_strategyオプションを使用すると、カスタムセレクター戦略を定義して、セレクターとして渡されたすべての"snake_kebab-words"を自動的に検出し、 [data-test-id="snake_kebab-words"]ロケーターに変換できます。次にbrowser.all('[data-testid=result]').first.element('[data-testid=result-title-a]').click() browser.all('result').first.element('result-title-a').click()テストIDによる検索を簡素化する方法をご覧ください。詳細については、ガイドを参照してください。
この機能は、Seleneの次のリリースで利用できます。
Seleneはブラウザドライバーを自動的に管理できますが、必要に応じてカスタマイズできます。
from selene import browser
browser . config . base_url = 'https://google.com'
browser . config . timeout = 2
browser . open ( '/ncr' ) from selenium import webdriver
from selene import browser
options = webdriver . ChromeOptions ()
options . add_argument ( '--headless' )
# Add other options as needed
# Selene will automatically detect the browser type (Chrome, Firefox, etc.)
# based on the options passed
browser . config . driver_options = options
browser . config . driver_remote_url = 'http://localhost:4444/wd/hub'
browser . config . base_url = 'https://google.com'
browser . config . timeout = 2
browser . open ( '/ncr' ) from selenium import webdriver
from selene import browser
options = webdriver . ChromeOptions ()
options . add_argument ( '--headless' )
# Add other options as needed
browser . config . driver = webdriver . Remote (
command_executor = 'http://localhost:4444/wd/hub' ,
options = options
)
browser . config . base_url = 'https://google.com'
browser . config . timeout = 2
browser . open ( '/ncr' )読み取り可能で安定したセレクターを使用します:ユニークで表現力豊かで、最小限にdom構造と組み合わされたセレクターを目指して、テストをより保守しやすくします。
再利用可能なコンポーネントのカプセル化:ページオブジェクトモデルを使用して、要素とアクションをカプセル化し、コードの再利用を促進します。
ビルトイン待機を活用する:セレンは、要素が目的の状態になるのを自動的に待機し、明示的な待機の必要性を減らします。
APIを調べてください: Seleneのソースコードまたはドキュメントに飛び込み、利用可能な方法と構成をよりよく理解します。
Seleneへの貢献を歓迎します!これがあなたが関与する方法です:
詳細については、貢献ガイドを参照してください。
最近の更新の詳細については、The Changelogを参照してください。