1. POMとは何ですか?
POMは、Page Object Module(Page Object Mode)の略語であり、その目的は、WebUIテスト用のオブジェクトライブラリを作成することです。
このモードでは、アプリケーションに関係する各ページを個別のクラスとして定義する必要があり、クラスには、このページのページ要素オブジェクトと、これらの要素オブジェクトを処理するために必要なメソッドが含まれている必要があります。
プロセスに関連付けられたページをオブジェクトとして取得し、オブジェクトを接続してさまざまなプロセスを形成することで、POMは業界で最高のデザインパターンとして認識されています。
POMの利点
POMは、ページ要素の操作とビジネスプロセスを分離するモードを提供します。これにより、テストのコード構造が以前よりも明確で読みやすくなり、オブジェクトとメソッドを再利用するのがより便利になります。
オブジェクトライブラリは、テストケースに依存しない統合オブジェクトライブラリであり、さまざまなツールクラスを統合することでさまざまなテスト目的を達成できます。たとえば、UnitTestの統合は、単体テスト、自動化/機能テストに使用できます。また、JBehave/Cucumberを統合して受け入れテストを行うこともできます。
自動テスト全体の利点が簡単になります。変更が必要なページの要素がある場合は、それを呼び出す他のテストクラス/コードを変更せずに、カプセル化されたページ要素クラスを直接変更できます。このようにして、全体的なコード保守コストも削減されます。
POのコアは、同じページに属する要素をページクラスに配置する、階層化のアイデアです。
簡単な構造設計
論理コード
キーワード駆動型デザインパターンと同様に、すべてのユーティリティ関数のカプセル化を実装する基本クラス。
ページオブジェクトコード
システムページをベースに、ツール関数を呼び出すことでビジネスの運営を実現し、対応するページオブジェクトを生成します。
テストコード
テストのニーズに基づいて、コンポーネントページオブジェクトを使用してコアプロセスを自動化し、テストケースを実行します。
テストデータ
テストケースの実行に必要なテストデータを提供します。
POMの完全なフレームワーク
ベースレイヤー
プロジェクトに必要な基本的なメソッド、特に要素クリック操作、sendkeys操作、JavaScriptスクリプトの呼び出し方法、および基本的なブラウザーに関連するその他の操作など、いくつかの基本的な操作を定義します。
共通層
Excelファイルの処理、プロジェクトパスの取得、システムURL情報のテスト、およびフレームワーク実行関連のログ関数の実装メソッドが含まれています。
Data层
プロジェクトを維持し、全体的な構造を強固にするために、テストデータを維持できる場所にテストデータを保存します。テストデータは、自動テストの推進要因となる場合があるため、データの管理と保守は特に重要です。
ログレイヤー
プロジェクトの実行中に生成されたログファイルを保存します。
PageObjectレイヤー
これがPOのコアレイヤーであり、コードテクノロジーだけでなく、プロジェクトビジネスの分析も含み、プロジェクトのページを分析します。
レポートレイヤー
プロジェクトの実行中に生成されたテストレポートファイルを保存します。テストレポートは、テスト結果の要約です。
TestCaseレイヤー
テストケースを管理し、テストを実行します。これは、テストの総入場に相当します。
config.ini
プロジェクト全体で使用する必要のある構成アイテム。
プロジェクト戦闘
例としてBaidu検索を取り上げます
最初に、次の図に示すように、base、data、page_object、casesという単純なプロジェクト構造を作成します。
image.png2.基本パッケージの下に新しいbase_page.pyファイルを作成し、base_page.pyファイルの下に基本クラスとして新しいBasePageクラスを作成します。これは、後続のページオブジェクトクラスに便利なさまざまな一般的に使用されるカプセル化された関数を提供します。電話。
Seleniumで一般的に使用される機能:要素の配置、入力、クリック、URLへのアクセス、待機、閉じるなど。コードは次のように表示されます。
'''
基类:提供各个常用的已封装好的函数,便于后续的页面对象类进行调用。
selenium中常用的函数:元素定位、输入、点击、访问URL、等待、关闭
'''
from time import sleep
from selenium import webdriver
class BasePage:
driver = webdriver.Chrome()
# 访问URL
def visit(self, url):
self.driver.get(url)
# 元素定位
def locator(self, loc):
return self.driver.find_element(*loc)
# 输入
def input(self, loc, txt):
self.locator(loc).send_keys(txt)
# 点击
def click(self, loc):
self.locator(loc).click()
# 等待
def wait(self, time):
sleep(time)
# 关闭
def close(self):
self.driver.quit()
(完全なコードを表示するには、左右にスワイプします)
page_objectパッケージの下に新しいsearch_page.pyファイルを作成し、ファイルの下に新しいSearchPageクラスを作成してBasePageクラスを継承し、基本クラスのメソッドを呼び出してページ操作を実装し、対応するページオブジェクトを生成します。コードは次のように表示されます。
'''
百度查询页面,搜索功能
'''
from selenium.webdriver.common.by import By
from base.base_page import BasePage
from selenium import webdriver
class SearchPage(BasePage):
url = 'http://www.baidu.com'
# 定位百度输入框
search_input = (By.NAME, 'wd')
# 定位百度一下按钮
search_button = (By.ID, 'su')
# 封装实现业务流程的函数
def search(self, txt):
self.visit(self.url)
self.wait(2)
self.input(self.search_input, txt)
self.wait(2)
self.click(self.search_button)
(完全なコードを表示するには、左右にスワイプします)
BaiduでそれぞれSeleniumとPythonを検索するためのテストクラスとして、casesパッケージの下に新しいtestcase.pyファイルを作成します。コードは次のとおりです。
'''
测试类
'''
import unittest
from page_object.search_page import SearchPage
from selenium import webdriver
class Case(unittest.TestCase):
def test_search1(self):
driver = webdriver.Chrome()
txt = 'selenium'
SearchPage(driver).search(txt)
def test_search2(self):
driver = webdriver.Chrome()
txt = 'python'
SearchPage(driver).search(txt)
if __name__ == '__main__':
unittest.main()
(完全なコードを表示するには、左右にスワイプします)
上記のコードを実行すると、WebDriverが2回作成されるため、コードを実行するたびにChromeブラウザーが開きます。同時に、コードに冗長性があります。
最適化
@classmethodを事前条件と事後条件として追加できます。また、検索条件をデータ駆動型の方法で完了できるため、コードの可読性と保守性が向上します。
データパッケージの下に新しいsearchTXT.yamlファイルを作成し、検索コンテンツを次のように保存します。
最適化後のコードは次のとおりです。
'''
测试类
'''
import unittest
from page_object.search_page import SearchPage
from selenium import webdriver
import ddt
@ddt.ddt()
class Case(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.driver = webdriver.Chrome()
cls.se = SearchPage(cls.driver)
@classmethod
def tearDownClass(cls) -> None:
cls.driver.quit()
@ddt.file_data('../data/searchTXT.yaml')
def test_search(self, txt):
self.se.search(txt)
if __name__ == '__main__':
unittest.main()
(完全なコードを表示するには、左右にスワイプします)
上記のコードを実行すると、テストケースが4回実行され、Selenium、Python、Java、phpがそれぞれ検索されるため、データ駆動型が実現され、ブラウザでも操作が完了します。
追記
上記は、POMデザインパターンを実装するだけで、基本クラス、ページオブジェクトレイヤー、データレイヤー、テストレイヤーのコード書き込みを完了します。読者が興味を持っている場合は、レポートレイヤー、ログレイヤーなどの書き込みを完了することができます。 、そして最終的に完全なフレームワークを実現します。
終わり
最後に、私の記事を注意深く読んでくださった皆様に感謝申し上げます。ファンの注目を集める中、常に礼儀正しい交流が必要です。あまり価値のあるものではありませんが、ご利用いただければ幸いです。あなたはそれを直接取ることができます。
これらの資料は、[ソフトウェアテスト]を行う友人にとって最も包括的で完全な準備倉庫である必要があります。この倉庫は、最も困難な旅にも同行しました。これもお役に立てば幸いです。特にテクノロジー業界では、すべてをできるだけ早く行う必要があり、技術基盤を改善する必要があります。お役に立てば幸いです……。