ソフトウェア テスト フレームワークの戦闘: Python+Slenium は、Web 自動テスト フレームワークに関する完全なチュートリアルを構築します

Python+Selenium は人気のある Web 自動化テスト フレームワークであり、実際のユーザー操作をシミュレートし、Web ページの機能とスタイルを検証できます。Selenium を介して Web ページをテストするには、次の手順が必要です。

Selenium ライブラリとブラウザ ドライバーをインストールします。
Selenium が提供するメソッドを使用して、ブラウザ ウィンドウのサイズ、戻る、進むなどを制御します。
Selenium が提供するメソッドを使用して、クリック、入力、属性の取得などのページ要素を見つけて操作します。
単体テスト、ロギング システム、データベース、その他のソフトウェアを使用して、データ駆動型テストと POM 設計パターンのために Selenium と連携します。

1. Seleniumライブラリとドライバのインストール方法

pip コマンドを使用してSelenium ライブラリをインストールします。たとえば、コマンドラインで次のように入力できます。

pip install selenium

または

pip3 install selenium

ブラウザドライバーをダウンロードしてインストールします。たとえば、Chrome ブラウザを使用している場合は、対応するバージョンの chromedriver を公式 Web サイトからダウンロードし、Python のインストール パスに置くことができます。

2. Seleniumによるブラウザ制御の具体的な実行方法

Selenium の Webdriver モジュールをインポートします。

from selenium import webdriver

Chrome ブラウザを開くために使用するブラウザを指定する Webdriver オブジェクトを作成します。そして、webdriver オブジェクトのメソッドを使用してブラウザを操作します。

web = webdriver.Chrome()

URLにアクセスしてください

web.get(url)

下がってください

web.back()

ケース 1: Selenium がブラウザを制御する

Selenium を使用して Chrome ブラウザを制御し、Baidu Web サイトを開いてキーワードを入力して検索し、ブラウザを閉じるとします。次のコードを参照できます。

#导入selenium的webdriver模块
from selenium import webdriver
 
#创建一个webdriver对象,指定使用Chrome浏览器
web = webdriver.Chrome()
 
#访问百度网站
web.get('https://www.baidu.com/')
 
#找到搜索框元素,并输入关键词
search_box = web.find_element_by_id('kw')
search_box.send_keys('selenium')
 
#找到搜索按钮元素,并点击
search_button = web.find_element_by_id('su')
search_button.click()
 
#关闭浏览器
web.quit()

3. Selenium がページ要素を見つけて操作する方法

Selenium は、さまざまなメソッドを使用して、ID、名前、クラス名、CSS セレクター、リンク テキスト、タグ名、Xpath などのページ要素を検索および操作できます。要素の属性または位置に基づいて、適切な方法を選択できます。

ケース 2: ページの配置

たとえば、Baidu ホームページで検索ボックスを見つけたい場合は、次のようにします。

#通过id定位
search_box = web.find_element_by_id('kw')
#通过name定位
search_box = web.find_element_by_name('wd')
#通过css选择器定位
search_box = web.find_element_by_css_selector('#kw')

テキストの入力やボタンのクリックなど、ページ要素を操作する必要がある場合は、次のコードを使用できます。

#在搜索框中输入文本
search_box.send_keys('selenium')
#找到搜索按钮并点击
search_button = web.find_element_by_id('su')
search_button.click()

ケース 3: Selenium がドロップダウン ボックスを操作する

select タグのドロップダウン ボックスを処理する必要がある場合は、selenium が提供する select モジュールを使用できます。このモジュールには、ドロップダウン ボックスのオプションを選択するための 3 つの方法があります: インデックス、値、またはテキスト属性に応じて

たとえば、以下のドロップダウン ボックスで「北京」オプションを選択するとします。

<select id="city">
    <option value="sh">上海</option>
    <option value="bj">北京</option>
    <option value="gz">广州</option>
</select>

次のコードが使用できます。

#导入select模块
from selenium.webdriver.support.select import Select
#定位到下拉框元素
city = web.find_element_by_id('city')
#创建Select对象
select = Select(city)
#根据索引选择第二个选项(索引从0开始)
select.select_by_index(1)
#或者根据值选择'bj'选项
select.select_by_value('bj')
#或者根据文本属性选择'北京'选项
select.select_by_visible_text('北京')

ドロップダウンボックス、非選択タグのドロップダウンボックス、例えばul-liタグのドロップダウンボックスを扱いたい場合、マウスクリックをシミュレートすることで操作を実現できます。たとえば、以下のドロップダウン ボックスで「Python」オプションを選択します。

<div class="dropdown">
  <button class="btn btn-default dropdown-toggle" type="button" id="menu1" data-toggle="dropdown">编程语言<span class="caret"></span></button>
  <ul class="dropdown-menu" role="menu" aria-labelledby="menu1">
    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Java</a></li>
    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Python</a></li>
    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">C++</a></li>
  </ul>
</div>

これは次のコードで実現できます。

//定位到按钮元素并点击展开下拉框
WebElement button = driver.findElement(By.id("menu1"));
button.click();
//定位到列表元素并获取所有子元素(即选项)
WebElement list = driver.findElement(By.className("dropdown-menu"));
List<WebElement> options = list.findElements(By.tagName("li"));
//遍历所有子元素,找到文本为'Python'的选项并点击
for (WebElement option : options) {
    if (option.getText().equals("Python")) {
        option.click();
        break;
    }
}

4. データ駆動型テストと POM モード

単体テスト、ログ システム、データベース、その他のソフトウェアを使用して Selenium と連携してデータ駆動型テストや POM 設計パターンを実行するには、次の手順が必要です。

1. コードとデータを分離するエンジニアリング構造を確立し、各ページがクラスに対応します。

新しいプロジェクトを作成します。各ページはパッケージに対応し、各パッケージの下に __init__.py ファイルがあります。
各パッケージの下にクラスを作成して、ページ要素とアクションをカプセル化します。
ルート ディレクトリに Baseinfo フォルダーを作成し、定数と構成情報を保存します。
ルート ディレクトリにテスト ケース フォルダーを作成し、テスト ケースを保存します。
ルート ディレクトリにレポート フォルダーを作成し、テスト レポートを保存します。
2. 単体テスト フレームワークを使用してテスト ケースを編成および実行し、setUp メソッドとtearDown メソッドを使用して環境を初期化およびクリーンアップします。

Unittest.main() 関数を使用すると、現在のモジュール内の test で始まるテスト メソッドが自動的に検索され、実行されます。
TestSuite クラスを使用すると、複数のテスト ケースまたはテスト クラスをテスト スイートに追加し、TestRunner クラスを使用してそれを実行できます。 TestLoader クラスを使用すると、指定されたスキーマまたはディレクトリに従ってテスト ケースをロードし、TestSuite オブジェクトを返すことができ
ます
Discover() 関数を使用すると、指定されたディレクトリ内のすべてのテスト ケースを自動的に検出し、TestSuite オブジェクトを返すことができます。
3. POM デザイン パターンを使用してページ要素と操作をカプセル化し、ページ オブジェクトをパラメータとしてテスト ケースに渡します。

ページクラスを作成し、オブジェクトクラスを継承し、ページ要素のロケータと操作メソッドを定義します。
テスト クラスを作成し、unittest.TestCase クラスを継承し、ページ クラスをインポートし、setUp メソッドでブラウザー ドライバーとページ オブジェクトを初期化します。
テスト メソッドで、ページ オブジェクトのアクション メソッドを呼び出し、アサーションを使用してテスト結果を検証します。
TearDown メソッドで、ブラウザー ドライバーを閉じます。
4. DDT や Yaml などのツールを使用して、データベース、Excel、CSV などの外部データ ソースを読み取り、デコレータやパラメータ化メソッドを使用してテスト ケースを駆動します。

DDT や Yaml などのツールを使用して外部データ ソースを読み取り、デコレーターまたはパラメーター化されたメソッドを使用してテスト ケースを駆動することは、データ駆動型のテスト方法であり、テスト データをテスト ケース コードから分離して、後のメンテナンスを容易にすることができます。

この方法で Excel データを読み取る一般的な手順は次のとおりです。

テスト データを保存する Excel ファイルを作成します。各行はテスト シナリオに対応し、各列はパラメータに対応します。
Excel ファイルを読み取り、openpyxl ライブラリまたは他のライブラリを使用して Excel ファイルを操作し、リストまたは辞書タイプのデータを返すクラスを作成します。
テスト クラスを作成し、unittest.TestCase クラスを継承し、クラスの前で @ddt デコレータを使用します。
テスト メソッドの前で @data または @file_data デコレータを使用し、Excel ファイルを読み取るクラスによって返されたデータを渡します。
テスト メソッドでパラメーターを定義してユース ケース データを受信し、リクエスト ライブラリまたは他のライブラリを呼び出してリクエストを送信し、アサーションを使用して応答結果を確認します。
DDT は、テスト メソッドを修飾するために使用できるデータ駆動型テスト デコレーターであり、パラメーターはファイル名またはリストです。ファイルのタイプは json または yaml です。ファイルがリストの場合、リストの値はテスト ケースのパラメーターとして使用されると同時に、テスト ケースのメソッド名の接尾辞として表示されます。ファイルが辞書の場合、辞書のキーがテスト ケース メソッドのサフィックスとして表示され、辞書の値がテスト ケースのパラメーターとして使用されます。

Yaml は、txt、excel、json に似たデータ形式です。データ型はマップ オブジェクト (キーと値のペア、コロンの後にスペースが必要) とリスト オブジェクト (- で始まる) の 2 つだけです。読み込んだ後は可変長の辞書の形になります。

ケース 4: DDT Yaml インターフェイス テスト

以下は、DDT と Yaml を使用したインターフェイス テストのコード例です。

import unittest
from ddt import ddt,data,file_data
import requests
import yaml
 
@ddt
class TestApi(unittest.TestCase):
 
    @file_data('test_data.yml')
    def test_api(self,**kwargs):
        url = kwargs.get('url')
        method = kwargs.get('method')
        data = kwargs.get('data')
        expect = kwargs.get('expect')
 
        if method.lower() == 'get':
            res = requests.get(url,params=data)
        elif method.lower() == 'post':
            res = requests.post(url,data=data)
        else:
            res = None
 
        self.assertEqual(res.json(),expect)
 
if __name__ == '__main__':
    unittest.main()

test_data.yml ファイルの内容は次のとおりです。

test_01:
  url: "http://httpbin.org/get"
  method: "get"
  data: {"name":"Tom","age":18}
  expect: {"args":{"age":"18","name":"Tom"},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate","Host":"httpbin.org","User-Agent":"python-requests/2.26.0","X-Amzn-Trace-Id":"Root=1-61d7f9c8-6a9b0e8a4f7c3b6d5e0a4f7c"},"origin":"223.104.63.230","url":"http://httpbin.org/get?name=Tom&age=18"}
test_02:
  url: "http://httpbin.org/post"
  method: "post"
  data: {"username":"admin","password":123456}
  expect: {"args":{},"data":"","files":{},"form":{"password":"123456","username":"admin"

最後に、私の記事を注意深く読んでくださった皆さんに感謝します。互恵性は常に必要です。それはそれほど価値のあるものではありませんが、必要な場合はそれを取り上げることができます。

ここに画像の説明を挿入

ソフトウェアテストインタビューアプレット

ソフトウェア テストの質問バンクには、何百万人もの人が参加しました。誰が知っているのか!ネットワーク全体で最も包括的なクイズ ミニ プログラムです。携帯電話を使用して、地下鉄やバスの中でもクイズに答えることができます。

次の面接の質問セクションが取り上げられます。

1. ソフトウェアテストの基礎理論、2. Web、アプリ、インターフェース機能テスト、3. ネットワーク、4. データベース、5. Linux

6. Web、アプリ、インターフェイスの自動化、7. パフォーマンス テスト、8. プログラミングの基本、9. 時間面接の質問、10. 公開テストの質問、11. セキュリティ テスト、12. コンピューターの基本

これらの資料は、[ソフトウェア テスト] の友人にとって最も包括的で完全な準備倉庫となるはずです。この倉庫は、最も困難な旅を乗り越える何万人ものテスト エンジニアにも同行してきました。あなたにも役立つことを願っています。  

おすすめ

転載: blog.csdn.net/2301_78276982/article/details/132496558