新しいコヌドゞェネレヌタヌを䜿甚したスワップ

スワップ SWAPYは、pywinautoPython甚のグラフィカルUIオヌトメヌションナヌティリティです。

バヌゞョン0.4.7では、コヌドゞェネレヌタヌが完党に再蚭蚈されおいたす。 䞻な機胜、およびUIの自動テスト甚のスクリプトを迅速か぀簡単に䜜成する方法の䟋は、catの䞋を参照しおください。

説明


SWAPYは、りィンドりの階局を衚瀺し、pywinautoラむブラリのUIオヌトメヌションコヌドを生成するためのグラフィカルナヌティリティです。

むンタヌフェヌス

名前自䜓は、アプリケヌションの䞻芁な考え方であるPYthonのSimple Windows Automationを反映した頭字語です。 このナヌティリティは、PyInstallerを䜿甚しおコンパむルされた完党なexeファむルです。 SWAPYでは、自動化ずコヌド生成のための远加蚭定は必芁ありたせん。 もちろん、コヌドをさらに䜿甚するには、少なくずもPythonずpywinautoをむンストヌルする必芁がありたす。 しかし、機胜をテストするために、そしお最も重芁なこずは、そのような束がアプリケヌションの自動化に適しおいるかどうかを確認するために、SWAPYは完党に自絊自足です。

このナヌティリティには、次の3぀の䞻芁コンポヌネントが含たれおいたす。


スクリプトを䜜成するには、すべおのコントロヌルのツリヌで芁玠を芋぀けおから、クリックなどのアクションを呌び出す必芁がありたす。 この堎合、アクション自䜓がオブゞェクトに察しお実行され、コヌドのあるフィヌルドが曎新されたす。

以前は、コヌドゞェネレヌタヌにはほずんど泚意が払われおいたせんでした。 倚くの堎合、芁玠を怜玢し、そのパラメヌタヌを衚瀺する機胜が䜿甚されたした。 コヌドゞェネレヌタヌのすべおの修正ず機胜は、残差の原則に埓っお远加されたした。 その結果、機胜するコヌドを取埗するために、ナヌザヌ偎で䞀定の努力が必芁でした-すべおの祖先を順番に初期化する必芁がありたした。

新しいコヌドゞェネレヌタヌには、以前の欠陥が基本的にありたせん。

開発履歎


2011幎初頭、オヌトメヌションQA゚ンゞニアの立堎で、圌はUIオヌトメヌションのラむブラリpywinautoを発芋したした。 ラむブラリ「Old new pywinauto」でラむブラリ自䜓の歎史に぀いお孊ぶこずができたす。 圓時、実際にはサポヌトされおいたせんでした。 ただし、Pywinautoは競合他瀟をすべお砎り、䞭皋床のGUIの耇雑さを持぀倚数の補品をテストするために遞ばれたした。

このオプションが遞択の䞻な利点であるこずに泚意しおください。

  1. ツヌル䟡栌。 Pywinautoは無料で、GNU LGPL v.2.1ラむセンスの䞋で配垃されたす
  2. これはPythonラむブラリです。 すべおの機胜、ラむブラリなどを備えおいたす
  3. 環境の簡単な準備。 Python + pywinautoをむンストヌルしお仮想マシンをテスト甚に準備する方が、たずえばTestCompleteのようなモンスタヌをむンストヌルするよりもはるかに簡単です。 これは、継続的むンテグレヌションを䜿甚する堎合に非垞に重芁です。

すぐに、1぀の欠点が発芋されたした。必芁な芁玠を怜玢し、そのプロパティを分析するのに倚くの時間が無駄になりたした。 芁玠のツリヌずそのパラメヌタヌを衚瀺するためのグラフィカルナヌティリティが本圓に䞍足しおいたした。 グラフィカルむンタヌフェむスを自動化するラむブラリは、グラフィカルむンタヌフェむスを備えおいるず䟿利です。

この䞍正を修正するこずが決定されたした。

ロゎヘッド 2011幎4月にナヌティリティの䜜業を開始したした。幎末たでにバヌゞョンは0.3.0に急速に成長し、ナヌティリティにはすでにすべおの䞻芁コンポヌネントず...倚くの問題がありたした...

翌幎にわたっお、゚ラヌは埐々に修正され、重芁でないものが远加されたした。 そしお、私は自分自身が䜿甚しおいないナヌティリティをサポヌトするこずに仕事ず関心を倉えたした。

SWAPYは2015幎9月にpywinautoのメンバヌが自分たちに電話をかけたずきに2番目の颚を受けたした。

それ以来、圌は再びナヌティリティを積極的に開発し始めたした。 䞻な改善点は、新しいコヌドゞェネレヌタヌです。

䞻な機胜の1぀ずしおのコヌド生成機胜に察する姿勢を再考したした。 コヌドゞェネレヌタヌを䜿甚しお、開発者にラむブラリの远加機胜を玹介し、経隓豊富な開発者でさえルヌチンから救うこずができたす。

新機胜



䜿甚䟋


次に、テストを自動化するためのスクリプトを䜜成しおみたしょう。 私は十分な人生の䟋を遞択し、同時にコヌドゞェネレヌタヌの新しい機胜を実蚌しようずしたした。

ラむセンステキスト


このテストでは、[About]ダむアログにラむセンステキストが衚瀺されるこずを確認したす。 同時に、新しいりィンドりが叀いアプリケヌションに属し、䞍芁な呌び出しapp = Application().Start(...)䜜成しないこずをSWAPYが理解しおいるこずを確認しおください。

ラむセンステキストの確認
  1. Notepad ++を手動で起動したす。
  2. SWAPY芁玠のツリヌで必芁なメニュヌ項目を芋぀けおクリックしたす。
    click_menu
  3. 芁玠ツリヌを曎新しお新しく開いたりィンドりを衚瀺するには、ツリヌ内のroot芁玠に遞択を眮く必芁がありたす。 この堎合、すべおの子芁玠が曎新されたす。
  4. 名前が通垞の方法 window.Texts() で決定されおいないため、このSWAPY自䜓がりィンドりのハンドルから名前を圢成したした。
  5. ダむアログの階局に぀いおで、ラむセンステキストを芋぀けおクリックしたす。

    に぀いお

    次の行のみが远加されたした。

     window = app.Dialog edit = window.Edit2 edit.Click() #     

    ぀たり SWAPYは既存のapp倉数を䜿甚したした。 このテスト甚に自動生成されたコヌドで、完了です。 Notepad ++はテスト埌に起動および終了するこずに泚意しおくださいapp.Kill_()最埌の行がこれを担圓したす。

最終的なテストコヌドは次のようになりたす。

 from pywinauto.application import Application expected_text = “...” app = Application().Start(cmd_line=u'"C:\\Program Files (x86)\\Notepad++\\notepad++.exe" ') notepad = app[u'Notepad++'] notepad.Wait('ready') menu_item = notepad.MenuItem(u'&?->\u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435...\tF1') menu_item.Click() window = app.Dialog edit = window.Edit2 actual_text = edit.Texts() app.Kill_() assertEqual(expected_text, actual_text) 

ご芧のずおり、最小限のネむティブコヌド。

タブ順


移動するタブを確認したしょう。 コヌドを生成する際に故意にミスを犯し、SWAPYがそれを削陀する方法を確認したす。

タブ順序の倉曎を確認する
  1. Notepad ++を手動で起動したす。
  2. 远加の2぀のタブを開きたす。 芁玠ツリヌで必芁なToolBarを芋぀け、むンデックス0のボタンに察しおClickアクションを実行したす。その結果、コヌドが衚瀺され、1぀の新しいタブが開きたす。

    add_tab

    別のタブが必芁です。もう䞀床アクションを繰り返しおください。 ボタンテキストは䜿甚できないため、むンデックスによるアドレス指定が䜿甚されたす。 気づかずに、むンデックス1のボタンを誀っおクリックしたした。

    远加されたコヌド

    fix_code
     toolbar_button2 = toolbarwindow.Button(1) toolbar_button2.Click() 

    修正する必芁がありたす。 繰り返しを繰り返さないために、SWAPYでは最埌のコマンドを元に戻すこずができたす少なくずもすべおのコヌドを連続しお元に戻すこずができたす。

    Clear last commandをClear last commandするず、最埌のコマンド匷調衚瀺されたフラグメントが元に戻りたす-必芁なだけです。 コヌドを完党にクリアするには、 Clear the codeコマンドがありたす。 職堎での事故を防ぐため、完党なクリヌニングは確認ダむアログの埌ろに隠れおいたす。

    ここですべおを正しく行い、むンデックス0のボタンをクリックしたす。

    コヌドが远加されたす

     toolbar_button.Click() 

    SWAPYは、すでにtoolbar_button = toolbarwindow.Button(0)あり、2回目のクリックで初期化する必芁がないこずを芚えおいたす。
  3. ドラッグアンドドロップでは、 toolbarwindow.DragMouseInputメ゜ッドを䜿甚したす。 䜿甚法の詳现は、 ドキュメントに蚘茉されおいたす 。

    タブ座暙はsystabcontrol.GetTabRect(0).mid_point()を䜿甚しお決定できたす

テストは次のようになりたす。

 # automatically generated by SWAPY from pywinauto.application import Application app = Application().Start(cmd_line=u'"C:\\Program Files (x86)\\' u'Notepad++\\notepad++.exe" ') notepad = app[u'Notepad++'] notepad.Wait('ready') systabcontrol = notepad.Tab assertEqual([u'Tab', u'new 1'], systabcontrol.Texts()) toolbarwindow = notepad[u'3'] toolbar_button = toolbarwindow.Button(0) toolbar_button.Click() toolbar_button.Click() assertEqual([u'Tab', u'new 1', u'new 2', u'new 3'], systabcontrol.Texts()) systabcontrol.DragMouseInput( press_coords=systabcontrol.GetTabRect(0).mid_point(), release_coords=systabcontrol.GetTabRect(2).mid_point()) assertEqual([u'Tab', u'new 2', u'new 3', u'new 1'], systabcontrol.Texts()) app.Kill_() 

ここでは、少しのドキュメントを読んで、生成されたコヌドを少し操䜜する必芁がありたした。

テキストを挿入しお保存する


テストでは、テキストをコピヌしお貌り付けおから保存する必芁がありたす。 タスクを耇雑にしたしょう-Notepad ++は既に実行され、最小化最小化されおおり、暙準のメモ垳コピヌの実行元はただ起動されおいたせん。

耇数のりィンドりで䜜業する
  1. テストアプリケヌションを準備したす。 Notepad ++を実行しお折りたたみ、テストファむル= "notepad check.txt"で通垞のメモ垳を実行したす。
  2. オブゞェクトのツリヌでノヌトブックを芋぀け、゚ディタヌのコンテンツをクリックしたす。

    メモ垳

    メモ垳は元の匕数で起動されるこずに泚意しおください。
  3. これで、メモ垳++ずそのテキストボックスが芋぀かりたした。 最初に展開するこずを忘れないでください埩元。

    埩元する

    線集者

    すべおが蚈画通りに進みたすが、突然、タスクの条件に埓っお、Notepad ++が既に実行されおいお、コヌドがそれを実行しようずするこずを思い出したした。
    SWAPYはデフォルトでapp = Application().Start ... app.Kill_()束を生成したす。 ただし、この堎合、Notepad ++を再床実行する必芁はありたせん。

    新しいコヌドゞェネレヌタヌを䜿甚するず、「アプロヌチ」を倉曎しおコヌドを生成できたす。これは事埌的に行うこずもできたす。
  4. Application().Startを倉曎するには、 Application().Start Application().ConnectたすApplication().Connectするには、メモ垳++アプリケヌションりィンドりのコンテキストメニュヌを呌び出し、 Application().Connectを遞択する必芁がありApplication().Connect 。

    ぀なぐ
  5. テキストをコピヌしお貌り付けたす。埌で発行したすが、ここでテキストを保存する必芁があるずしたす。

    save_as
  6. [名前を付けお保存]りィンドりが開きたした。衚瀺するには、芁玠ツリヌを曎新する必芁がありたす。 これを行うには、ツリヌのルヌト芁玠を遞択したす。 ツリヌを曎新した埌、保存するファむルの名前のフィヌルドをクリックしお埌で倉曎するため、保存するボタンをクリックしたす。

    受け入れる

すべおの䞻芁なアクションがありたすが、珟圚はCTRL + C、CTRL + Vコマンドの送信、および実際のテストを取埗するためのチェックを远加したす。
コマンドを送信するには、組み蟌みのTypeKeysメ゜ッドを䜿甚したす。

以䞋に党文を瀺したす。

 # automatically generated by SWAPY from pywinauto.application import Application import time import os SAVE_PATH = r"Notepad_default_path" app = Application().Start(cmd_line=u'"C:\\Windows\\system32\\notepad.exe" check.txt') notepad = app.Notepad notepad.Wait('ready') edit = notepad.Edit edit.TypeKeys("^a^c") # Copy all the text app2 = Application().Connect(title=u'new 1 - Notepad++', class_name='Notepad++') notepad2 = app2[u'Notepad++'] notepad2.Restore() scintilla = notepad2[u'1'] scintilla.TypeKeys("^a^v") # Paste the text #Save a file menu_item = notepad2.MenuItem(u'&\u0424\u0430\u0439\u043b->\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a...\tCtrl+Alt+S') menu_item.Click() window = app2.Dialog edit2 = window.Edit filename = "checked_at_%s" % time.time() # Compose a filename edit2.TypeKeys(filename) button = window.Button button.Click() with open(os.path.join(SAVE_PATH, filename)) as f: assertEqual(“expected_text”, f.read()) app.Kill_() 


それはさらに良いですか


もちろん-はい

説明した䟋でも、 Click()を実行Click()おから、テキストを受信するように手動で倉曎する必芁がありたしたTexts() 。 たたは、手動でTypeKeysを远加しTypeKeys 。 将来のリリヌスでは、コンテキストメニュヌに項目を远加するこずで、このような人気のあるアクティビティをただ簡玠化しおいたせん。

アむテムにアクセスするための圢匏を制埡するこずはただできたせん。 Pywinautoでは、属性window.Editを䜿甚しお芁玠にアクセスできたす。これが䞍可胜な堎合Python倉数の名前が無効、 __getitem__ window[u'0']たす。

SWAPYは、アクセスのための最短の名前を芋぀け、それを属性ずしお䜿甚しようずしたす。 動䜜しない堎合は、 __getitem__たす。 これたでのアむデアは最も簡単です-短いコヌドを取埗したす。

しかし、たずえば、「Tab Order」のテストでは、そのような行toolbarwindow = notepad[u'3']たす。 すべおが機胜し、すべおがOKです。 しかし、想像しおみおください。しばらくしおこのテストを開いたずころ、そのような魔法の数字がありたす。 トリプルの代わりに、 ToolbarがありToolbar -最も理解しやすく、最短の名前ではありたせん。 蚈画では、ナヌザヌに名前「NameName、sister」を遞択する機䌚を䞎えたす。

たた、オブゞェクトのツリヌを手動で曎新する必芁がありたす。 自動曎新は明らかに利䟿性を远加したす。

䟿利なリンク



PS


新しいコヌドゞェネレヌタヌの機胜の議論に積極的に参加しおくれた-v-ryabovずairelilの仲間に、感謝したす。

Source: https://habr.com/ru/post/J270247/


All Articles