pywinautoのHowToの日本語訳の初校

英語力がない人なので、誤り等がいっぱいあると思いますが、どしどしご指摘ください。m(_ _)m
本文の下に和訳を記載します。この内容である程度のことが出来ると思います。
英語力のあるかたは、こちらを参照ください。(同じ内容ですが。。)
http://pywinauto.openqa.org/howto.html

もっと見やすい方法で公開する方が良いと思うのですが、準備して進めていきたいと思います。:-)
それまで、校正を続けて、確かなものを掲載できればと思います。
ご協力よろしくお願いしますm(_ _)m UWSCには負けないぞー!!

How To's

操作手順

How to sepcify an usable Application instance
アプリケーションのインスタンスを指定して使う方法

An Application() instance is the point of contact for all work with the app you are automating. So the Application instance needs to be connected to a process. There are two ways of doing this: Application()

  • Application関数のインスタンスはあなたが自動化しているアプリによる全ての仕事のための接点です。Applicationは、プロセスに接続している必要があります。2つの方法があります。-
start_(self, cmd_line, timeout = app_start_timeout):

or

connect_(self, **kwargs):

Start_() is used when the application is not running and you need to start it. Use it in the following way:

  • Start()関数は、アプリケーションが起動していないときに起動させる為に使います。以下の方法で使用してください。 -
app = Application()
app.start_(r"c:\path\to\your\application -a -n -y --arguments")

The timeout parameter is optional, it should only be necessary to use it if the application takes a long time to start up.

  • timeout パラメータはオプションです。アプリケーションの起動に長い時間がかかるなら、使うべき(必要?)です。 -

connect_() is used when the application to be automated is already running. To specify a an already runing application you need to specify one of the following:

  • connect()関数は、アプリケーションが既に起動済みである場合に使います。既に起動しているアプリケーションを1つ指定する必要があります。 -

process: the process id of the application, e.g.

  • 例えば、アプリケーションのプロセスID -
app = Application()
app.connect_(process = 2341)

handle: The windows handle of a window of the application, e.g.

  • 例えば、Windowsハンドルはアプリケーションのウインドウを扱えます - (訳おかしい??)
app = Application()
app.connect_(handle = 0x010f0c)

path: The path of the executable of the process (GetModuleFileNameEx is used to find the path of each process and compared against the value passed in) e.g.

  • 例えば、パスからプロセスを実行可能です。(モジュール名のパスとプロセスの値を比較して、使います) -(へん?)
app = Application()
app.connect_(path = r"c:\windows\system32\notepad.exe")

or any combination of the parameters that specify a window, these get passed to the findwindows.find_windows() function. e.g.

  • または、ウィンドウと、パラメータの組み合わせを指定してしても、これらはfindwindows関数を通り、機能します。 - (あやしい・・・)

>||python|
app = Application()
app.connect_(title_re = ".*Notepad", class_name = "Notepad")
|

Note: I have since added static methods Application.start() and Application.connect() these can be used the same as above - except that you no longer need to instantiate an Application object first.

  • わからないので、後回し・・・ -

Note2: The application has to be ready before you can use connect*(). There is no timeout or retries like there is when finding the application after start*(). So if you start the application outside of pywinauto you need to either sleep or program a wait loop to wait until the application has fully started.

  • Connect関数を使うことができる前に、アプリケーションは準備ができていなければなりません。タイムアウトが無いからです。または、start関数でアプリケーションを見つけ、その他を再び試みる。(かなりあやしい・・・)

あなたが pywinautoの外でアプリケーションを始めるならば、アプリケーションが完全に始まるまで、スリープさせるか、待ちループがするようにプログラムする必要があります。-

How to sepcify a dialog of the application

アプリケーションダイアログを指定する方法

Once the application instance knows what application it is connected to a dialog to work on needs to be specified.

  • 一度アプリケーションインスタンスがどんなアプリに接続されたか、ダイアログを操作するには指定する必要があります。 - (日本語おかしい・・・)


There are many different ways of doing this. The most common will be using item or attribute access to select a dialog based on it's title. e.g

  • 多くの異なる方法があります。 最も一般なものはアイテムを使用します。または ダイアログベースのタイトルを選択し、属性からアクセスすることです。 -
dlg = app.Notepad

or equivalently

  • または、同等に -
dlg = app['Notepad']

The next easiest method is to ask for the top_window_() e.g.

  • 次の最も簡単な方法は、top_window()関数から求めることになっています。例えば。
dlg = app.top_window_()

This will return the window that has the highest Z-Order of the top-level windows of the application.

  • これは、アプリケーションのトップレベルのウィンドウでZオーダーのウィンドウを返します。 -


Note: This is currently fairly untested so I am not sure it will return the correct window. It will definitely be a top level window of the application - it just might not be the one highest in the Z-Order.

  • これは、現在かなり試されていないです。返されたウィンドウが正しいかは確信できないです。それは、確実にアプリケーションのトップレベルのウィンドウでしょう。それは、今の一番上のZオーダーではないかもしれないです。 - (なんかおかしい)


If this is not enough control they you can use the same parameters as can be passed to findwindows.find_windows() e.g.

  • もし、十分なコントロールでは無ければ、いくつかのパラメータ使うことで、ウィンドウを探すことが出来ます。find.windows関数です。例えば -
dlg = app.window_(title_re = "Page Setup", class_name = "#32770")

Finally to have the most control you can use

  • 最終的に、あなたがたくさんコントロールできるものを使ってください - ???
dialogs = app.windows_()

this will return a list of all the visible, enabled, top level windows of the application. You can then use some of the methods in handleprops module select the dialog you want. Once you have the handle you need then use

  • これは、アプリケーションのアクティブウィンドウのvisible(見えて)で、enable(有効・可能)な全てのリストを返します。いくつかのhandleprops?メソッドを使い欲しいダイアログを選ぶことが出来きます。一旦、必要とするハンドルがあるなら使ってください。 - へん?
Application.window_(handle = win)

Note: If the title of the dialog is very long - then attribute access might be very long to type, in those cases it is usually easier to use:

  • もし、タイトルがとても長いダイアログのとき、とても長くタイプすることがあると考えます。それらの場合は、普通はより簡単に使います。
app.window_(title_re = ".*Part of Title.*")

How to specify a control on a dialog

ダイアログのコントロールを指定する方法

There are a number of ways to specify a control, the simplest are:

  • コントロールの指定は、番号によるものが一番シンプルです。 -
app.dlg.control
app['dlg']['control']

The 2nd is better for non English OS's where you need to pass unicode strings e.g. app[u'your dlg title'][u'your ctrl title']

  • 2番目に良いのは、英語OSでない場合は、UNICODE文字列を渡す必要があります。

例:app.[UNICODEダイアログタイトル].[コントロールタイトル]]


The code builds up multiple identifiers for each control from the following: - コードは、以下からそれぞれ複数の識別子を確立します -

    • title(タイトル)
    • friendly class(これ何だろう?)
    • title + friendly class(タイトルとなに?)

If the control's text is empty (after removing non char characters) text is not used. Instead we look for the closest control above and to the right fo the contol. And append the friendly class. So the list becomes

  • もしコントロールにテキストが空なら(後で、char characters を取り去っても?)テキストは使用することは出来ません。その代わり、最も近い適切なコントールを探します。そして、frendly calssを付け加えてください。その結果リストになるでしょう。
    • friendly class(これ何だろう?)
    • closest text + friendly class(最も近いテキスト + friendly class)

Once a set of identifiers has been created for all controls in the dialog we disambiguate them.

  • 一度、ダイアログで作成された全てのコントロールの識別子をそれぞれ区別しセットします。 -


use the WindowSpecification.print_control_identifiers() method

  • WindowSpecificationクラスのprint_control_identifiers() メソッドを使用してください。 -


e.g.

app.YourDialog.print_control_identifiers()

Sample output:

Button - Paper   (L1075, T394, R1411, B485)
                'PaperGroupBox' 'Paper' 'GroupBox'
Static - Si&ze:   (L1087, T420, R1141, B433)
                'SizeStatic' 'Static' 'Size'
ComboBox -    (L1159, T418, R1399, B439)
                'ComboBox' 'SizeComboBox'
Static - &Source:   (L1087, T454, R1141, B467)
                'Source' 'Static' 'SourceStatic'
ComboBox -    (L1159, T449, R1399, B470)
                'ComboBox' 'SourceComboBox'
Button - Orientation   (L1075, T493, R1171, B584)
                'GroupBox' 'Orientation' 'OrientationGroupBox'
Button - P&ortrait   (L1087, T514, R1165, B534)
                'Portrait' 'RadioButton' 'PortraitRadioButton'
Button - L&andscape   (L1087, T548, R1165, B568)
                'RadioButton' 'LandscapeRadioButton' 'Landscape'
Button - Margins (inches)   (L1183, T493, R1411, B584)
                'Marginsinches' 'MarginsinchesGroupBox' 'GroupBox'
Static - &Left:   (L1195, T519, R1243, B532)
                'LeftStatic' 'Static' 'Left'
Edit -    (L1243, T514, R1285, B534)
                'Edit' 'LeftEdit'
Static - &Right:   (L1309, T519, R1357, B532)
                'Right' 'Static' 'RightStatic'
Edit -    (L1357, T514, R1399, B534)
                'Edit' 'RightEdit'
Static - &Top:   (L1195, T550, R1243, B563)
                'Top' 'Static' 'TopStatic'
Edit -    (L1243, T548, R1285, B568)
                'Edit' 'TopEdit'
Static - &Bottom:   (L1309, T550, R1357, B563)
                'BottomStatic' 'Static' 'Bottom'
Edit -    (L1357, T548, R1399, B568)
                'Edit' 'BottomEdit'
Static - &Header:   (L1075, T600, R1119, B613)
                'Header' 'Static' 'HeaderStatic'
Edit -    (L1147, T599, R1408, B619)
                'Edit' 'TopEdit'
Static - &Footer:   (L1075, T631, R1119, B644)
                'FooterStatic' 'Static' 'Footer'
Edit -    (L1147, T630, R1408, B650)
                'Edit' 'FooterEdit'
Button - OK   (L1348, T664, R1423, B687)
                'Button' 'OK' 'OKButton'
Button - Cancel   (L1429, T664, R1504, B687)
                'Cancel' 'Button' 'CancelButton'
Button - &Printer...   (L1510, T664, R1585, B687)
                'Button' 'Printer' 'PrinterButton'
Button - Preview   (L1423, T394, R1585, B651)
                'Preview' 'GroupBox' 'PreviewGroupBox'
Static -    (L1458, T456, R1549, B586)
                'PreviewStatic' 'Static'
Static -    (L1549, T464, R1557, B594)
                'PreviewStatic' 'Static'
Static -    (L1466, T586, R1557, B594)
                'Static' 'BottomStatic'


This exmple has been taken from test_application.py

  • test_application.pyからこの例を取りました。 -


Note The identifiers printed by this method have been run through the process that makes the identifier unique. So if you have 2 edit boxes, they will both have "Edit" listed in their identifiers. In reality though the first one can be refered to as "Edit", "Edit0", "Edit1" and the 2nd should be refered to as "Edit2"

  • Note このメソッドによって表示された識別子はユニークな識別子を作るプロセスによって実行されました。もし、2つのエディットボックスがあれば、両方の「Edit」の識別子をリストされます。現実には、最初「Edit」、「Edit0」、「Edit1」のように1つ参照され、そして2回目は「Edit2」のように参照されるべきです。 - ??意味がわからない・・・


Note You do not have to be exact!. Say we take an instance from the example above: - Note  正確である必要はありません。インスタンスから例にとってみます。- ??おかしい

Button - Margins (inches)   (L1183, T493, R1411, B584)
                'Marginsinches' 'MarginsinchesGroupBox' 'GroupBox'

Let's say that you don't like any of these

  • これらのうち、どれも好まない場合 -
    • GroupBox - too generic, it could be any group box
    • GroupBox - あまりに汎用的。それは、いろいろなグループボックスがあることが出来るからです。 -


Marginsinches and MarginsinchesGroupBox - these just don't look right, it would be nicer to leave out the 'inches' part

  • Marginsinches と MarginsinchesGroupBox - これらは、「inches」の部分がなくなっているため、気持ちよく正しいと見えない -


Well you CAN! The code does a best match on the identifer you use against all the available identifiers in the dialog.

  • 十分にあなたはできます。そのコードは、あなたが使う識別子に対してダイアログのどれかの識別子と一致すれば利用できます -


For example if you break into the debugger you can see how different identifiers can be used:

  • 例えば、もし デバッガにbreakを加えると異なる識別子がどのように使われることができるかについて見ることができます -
(Pdb) print app.PageSetup.Margins.Text()
Margins (inches)
(Pdb) print app.PageSetup.MarginsGroupBox.Text()
Margins (inches)

And this will also cater for typos. Though you still have to be careful as if there are 2 similar identifiers in the dialog the typo you have used might be more similar to another control then the one you were thinking of.

  • それは、タイプミスしても要求みたすでしょう。またダイアログに似ている2つの識別子があれば、別のコントロールを使ってしまうかもしれないので一度注意深く考えてください。- 微妙?

How to use pywinauto with application languages other than English

英語以外のOSでpywinautoを使う方法

Because Python does not support unicode identifiers in code you cannot use attribute access to reference a control so you would either have to use item access or make an explicit calls to window_().

  • Pythonユニコード識別子をサポートしていないので、あなたは、コードに属性を参照させてアクセスすることが出来ません。そのためアイテムを使ってアクセスするか、明確なWindowを呼ばなければなりません。 -


So instead of writing:

app.dialog_ident.control_ident.Click()

You would have to write:

  • あなたは以下のよう書かなければならない -
app['dialog_ident']['control_ident'].Click()

Or use window_() explictly:

  • または、明確にWindowを使う -
app.window_(title_re = "NonAsciiCharacters").window_(title = "MoreNonAsciiCharacters").Click()

To see an example of this see examples\MiscExamples.py.GetInfo() How to deal with controls that do not respond as expected (e.g. OwnerDraw Controls)

  • exampleのMiscExamples.pyのGetInfo関数を見てください。コントロールを取り扱っている方法は反応しないものもあります。例(OwnerDraw Controls) -


Some controls (especially Ownerdrawn controls) do not respond to events as expected. For example if you look at any HLP file and go to the Index Tab (click 'Search' button) you will see a listbox. Running Spy or Winspector on this will show you that it is indeed a list box - but it is ownerdrawn. This means that the developer has told Windows that they will override how items are displayed and do it themselves. And in this case they have made it so that strings cannot be retrieved :-(.

  • いくつかのコントロール(Ownerdrawn controls)特には期待されたEventに応答しません。例えば、もし複数のヘルプファイルを見ていてリストボックスからIndexタブ(Searchボタンをクリック)を見たいとします。Winspector(クラス名からオブジェクトを取得するツール)または Spy(Spy++ Windowsのメッセージを調べるツール)実行させ本当にそれがリストボックス見てみます。しかしそれは、ownerdrawn です。それは、開発者にはこの手段は、彼らがアイテムが表示される方法を越えて、それら自身をWindowsは見分けることに成功しました。そして、この場合、Stringが取って来れないという結果にたどり着きました:  -


So what problems does this cause?

  • 何が問題で原因? -
app.HelpTopics.ListBox.Texts()                # 1
app.HelpTopics.ListBox.Select("ItemInList")   # 2

Will return a list of empty strings, all this means is that pywinauto has not been able to get the strings in the listbox

  • #1は空の文字列がreturnされます。pywinautoは今まで、全てのStringをリストボックスから得ることは出来ませんでした。-


This will fail with an IndexError because the Select(string) method of a ListBox looks for the item in the Texts to know the index of the item that it should select.

  • #2はIndexErrorになり、失敗するでしょう。なぜならSelect(string)メソッドはリストボックスのアイテムをTextsで知りindexを選択しなくては、ならないからです。 -


The following workaround will work on this control

  • このコントロールの回避方法に取り組んでいきます。 -
app.HelpTopics.ListBox.Select(1)

This will select the 2nd item in the listbox, because it is not a string lookup it works correctly.

  • リストボックスの2番目を選ぶでしょう。なぜなら文字列を正確に処理する必要がないからです。 -


Unfortunately not even this will always work. The developer can make it so that the control does not respond to standard events like Select. In this case the only way you can select items in the listbox is by using the keyboard simulation of TypeKeys(). 

  • あいにく、いつも等しい処理ではありません。開発者が作るコントロールはいつも標準のイベントで反応するとは限らないからです。 -


This allows you to send any keystrokes to a control. So to select the 3rd item you would use:

  • コントロール名を送信しました。アイテムの3つ目を選択され使用することができでしょう。-
app.Helptopics.ListBox1.TypeKeys("{HOME}{DOWN 2}{ENTER}")

{HOME} will make sure that the first item is highlighted.

  • {HOME} 1番目のアイテムをハイライトして確かめます -


{DOWN 2} will then move the highlight down 2 items

  • {DOWN 2} ハイライトから下に2個下がったアイテムに移動します。 -


{ENTER} will select the highlighted item

  • {ENTER] ハイライトされたアイテムを選択します -


If your application made extensive use of a similar control type then you could make using it easier by deriving a new class from ListBox, that could use extra knowledge about your particular application. For example in the WinHelp example evertime an item is highlighted in the list view, it's text is inserted into the Edit control above the list, and you CAN get the text of the item from there e.g. 

  • ListBoxから新しいクラスを得ることによってより容易にそれからあなたがそれを使用して作ることができたら同じようなコントロールタイプに簡単に使用できる、それはあなたの特定の用途のアプリケーションについて知っている特別なことを使用してもよい。 例えばWinHelpの例のevertimeで項目はリストはViewで強調される、それはリストの上のEditコントロールにテキスト挿入され、そしてそこからアイテムのテキストを得ることができる。 -


# print the text of the item currently selected in the list box
# (as long as you are not typing into the Edit control!)
print app.HelpTopics.Edit.Texts()[1]

How to Access the System Tray (aka SysTray, aka 'Notification Area')

システムトレイにアクセスする方法 (別名SysTray、別名'通知エリア’)

Near the clock are icons representing running applications, this area is normally referred to as the "System Tray". There are actually many different windows/controls in this area. The control that contains the icons is actually a toolbar. It is in a Pager control, in within a window with a class TrayNotifyWnd, which is in yet another window with a class Shell_TrayWnd and all these windows are part of the running Explorer instance. Thankfully you don't need to remeber all that :-).

  • 時計近くに実行しているアプリケーションのアイコンを表示します。このエリアは、通常"システムトレイ"といわれます。たくさんの異なるWindows/コントロールが実はこのエリアにあります。アイコンを含むコントロールは実はツールバーに存在します。それは、Pager controlの内部WindowのShell_TrayWndクラスかTrayNotifyWndクラスのどちらかに全て含まれ、Windowsエクスプローラインスタンスの一部を実行します。ありがたいことにその全てを思い出す必要はありません -


The things that are important to remember is that you are looking for a window in the "Explorer.exe" application with the class "Shell_TrayWnd" that has a Toolbar control with a title "Notification Area".

  • 思い出す重要なポイントはそれが「Explorer.exe」アプリケーションのウインドウを探すことで、「Notfication Area」のタイトルとToolbarコントールの「Shell_TrayWnd」です。 -


One way to get this is to do the following:

  • これを得る1つの方法は、以下を実施します: -
import pywinauto.application
app = pywinauto.application.Application().connect_(path = "explorer")
systray_icons = app.ShellTrayWnd.NotificationAreaToolbar

The taskbar module provides very preliminary access to the System Tray.

  • タスクバーモジュールはSystem Trayを利用して提供されています -


It defines the following variables:

  • 以下のように可変で定義されています。 -


explorer_app: defines an Application() object connected to the running explorer. You probably don't need to use this your self very much.

  • explorer_app: Application関数で定義しています。オブジェクトはexplorerと繋がります。恐らくたくさんこれを使う必要はないでしょう -


TaskBar: The handle to the task bar (the bar containing Start Button, the QuickLaunch icons, running tasks, etc

  • TaskBar: タスクバーへのハンドル(バーはスタートボタン含み、クイックランチャ、実行タスク等) -


StartButton: "Start me up" I think you might know what this is!

  • StartButton: "Startを立ち上げてください。これが何であるかについてわかっていると思います!-


QuickLaunch: The Toolbar with the quick launch icons

  • QuickLaunch: ツールバーのQuickLaunchアイコンと一緒です。 -


SystemTray: The window that contains the Clock and System Tray Icons

  • SystemTray: ClockとシステムTray Iconsを含むウインドウ -


Clock: The clock

  • 時計 -


SystemTrayIcons: The toolbar representing the system tray icons

  • SystemTrayIcons: システムと例アイコンはツールバーに相当します -


RunningApplications: The toolbar representing the running applications

  • RunningApplications: 実行中のアプリケーションはツールバーに相当します -


I have also provided 2 functions in the module that can be used to click on system tray icons:


ClickSystemTrayIcon(button): You can use this to left click a visible icon in the system tray. I had to specifically say visible icon as there may be many invisible icons that obviously cannot be clicked. Button can be any integer. If you specify 3 then it will find and click the 3rd visible button. (very little error checking is performed and this method will more then likely be moved/renamed in the futures.

  • ClickSystemTrayIcon(button): システムトレイアイコンが可視状態なら左クリックを使うことが出来ます。明確に言えるのは、可視状態のアイコンより、たくさんのアイコンがたぶん不可視で、クリックすることが出来ないでしょう。ボタンは任意の整数になりえます。もしあなたが3を指定するならば、それは第3の見えるボタンを見つけて、クリックします。(チェックしているごくわずかなエラーしか実行されません、そして、この方法はよりそれからたぶん動かされて/将来に名前を変えられます。) -


RightClickSystemTrayIcon(button):

Similar to ClickSytemTrayIcon but performs a right click. Often when you click/right click on an icon - you get a popup menu. The thing to remember at this point is that the popup menu is part of the application being automated not part of explorer.

  • RightClickSystemTrayIcon(button): ClickSytemTrayIconと似た動作をします。たびたびアイコンのクリックをクリックし直すとき、 あなたは、ポップアップメニューを得ます。この点で覚えているものは、ポップアップメニューがexplorerの一部が自動化されていないアプリケーションの一部が存在しているということです。 -


e.g.

# connect to outlook
outlook = Application().connect_(path = 'outlook.exe')
# click on Outlook's icon
taskbar.ClickSystemTrayIcon(2)
# Select an item in the popup menu
outlook.PopupMenu.MenuClick("Cancel Server Request")