Webdriver プロジェクト サイトでページ オブジェクトとデザイン パターンについて読んでいて、 pagefactoryに出会いました。Webdriver for Python API に pagefactory が含まれているようには見えません。これは本当ですか?
3 に答える
Python の Java アノテーション (@Find(By.xxx) など) に相当するものはないと思います。ただし、PageObject パターンを使用できないという意味ではありません。
ここで行う方法の良い例を見つけることができます: https://github.com/SeleniumHQ/selenium/blob/master/py/test/selenium/webdriver/common/google_one_box.py
Python のような動的に型付けされた言語は、オブジェクトを作成するためのデザイン パターンにあまりこだわっていません。これは、(適切なメソッドを使用して) 任意の型のオブジェクトを作成し、それを返すのが簡単であるためです。パターンは、一般的な問題に対する一般的な解決策です。何か問題がなければ、それを処理するためのパターンは必要ありません:-) OOP は当初、C の設計パターンでした。
編集、2017 年 12 月:
ページ自動化 (自動化された UI テストおよびその他の目的) のための自社製フレームワークでは、pageobject デザイン パターンを使用しますが、ページ ファクトリは必要ありませんでした。カスタム BasePage からの古い学校の継承は、すべての (非常に多様な) ニーズをカバーしました。ページ要素を作成し、適切なページがインスタンス化されていることを確認するためにいくつかのトリックを使用しています。その経験に基づいて、PageObject がシンプルであることが気に入っています。
また、必要がさらに複雑になった場合、Python では複数の継承が可能です。
私の経験 (Python、Selenium、および WebDriver を 5 年以上使用しています) では、ページ ファクトリ パターンの欠如は、実装できないということではなく、必要がないことを示しています。
pageobject_support
私は、Pythonic の方法で PageFactory パターンを実装するというモジュールを作成しました。
このモジュールを使用すると、Google 検索ページを次のようにモデル化できます。
from pageobject_support import cacheable, callable_find_by as find_by
from selenium.webdriver.common.by.By
class GoogleSearchPage(object):
_search_box = find_by(how=By.NAME, using='q', cacheable=True)
_search_button = find_by(name='btnK')
def __init__(self, driver):
self._driver = driver
def search(self, keywords):
self._search_box().click()
self._search_box().send_keys(keywords)
self._search_button().click()
フィードバックをお待ちしております。詳細については、https://jeremykao.wordpress.com/2015/06/10/pagefactory-pattern-in-python/をご覧ください。