5

Selenium では時間がかかりすぎるフォーム (javascript の重い最新のフォーム) のテストを自動化しようとしています。xdotool を使用してウィンドウ ID を取得したいと考えています。xdotool selectwindow呼び出してクリックできるようですが、毎回クリックする必要があります。「タブのタイトルがxのGoogle Chromeウィンドウの場合は、yを実行してください」と伝えたい

ここでウィンドウIDを取得しました:

cchilders@cchilders-Dell-Precision-M3800:~$ xdotool selectwindow
65011713

これはクロム自体のためのもので、クリックすると各タブは同じ値を取得します。だから私はpsまたはウィンドウマネージャでそれを見つけることを期待していましたが、そうではありません:

cchilders@cchilders-Dell-Precision-M3800:~$ wmctrl -l
0x03a00001  0 cchilders-Dell-Precision-M3800 views.py - /home/cchilders/work_projects - Atom
0x03a00048  0 cchilders-Dell-Precision-M3800 pip_freeze_update.py - /home/cchilders/scripts - Atom
0x03a000bc  0 cchilders-Dell-Precision-M3800 urls.py - /home/cchilders/work_projects - Atom

ps も機能しません。

(clientsite)cchilders@cchilders-Dell-Precision-M3800:~$ ps -alx
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0     1     0  20   0 185188  5752 ep_pol Ss   ?          0:06 /sbin/init splash
1     0     2     0  20   0      0     0 kthrea S    ?          0:00 [kthreadd]
1     0     3     2  20   0      0     0 smpboo S    ?          0:02 [ksoftirqd/0]
1     0     5     2   0 -20      0     0 worker S<   ?          0:00 [kworker/0:0H]
1     0     7     2  20   0      0     0 rcu_gp S    ?          1:10 [rcu_sched]
1     0     8     2  20   0      0     0 rcu_gp S    ?          0:00 [rcu_bh]
...etc...

65011713 はどこにも表示されません。Xdotool は優れたツールですが、ウィンドウを操作するには、ウィンドウについて多くのことを知っている必要がWINDOW COMMANDSあります。 #window_commandsには、よく知っているウィンドウを見つける方法がたくさんありますが、そのウィンドウ情報を自動的に取得する方法はあまりありません。URL の先頭部分をスクリプトに入力するなどして、ウィンドウ ID (xdotool が必要とする形式) を自動的に決定するにはどうすればよいですか? ありがとうございました

wmtrl で Google Chrome を探すことができます。

(scripts)cchilders@cchilders-Dell-Precision-M3800:~/scripts/bash$ wmctrl -l
0x03e00001  0 cchilders-Dell-Precision-M3800 Edit - Stack Overflow - Google Chrome
...

スペースで区切られた最初の数値を int に取得します。

In [13]: int("0x03e00001", 16)
Out[13]: 65011713

int の 16 フラグは、16 進数を想定していることを示します

In [14]: int("0x03e00001")
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-14-96517b980767> in <module>()
----> 1 int("0x03e00001")

ValueError: invalid literal for int() with base 10: '0x03e00001'
4

3 に答える 3

4

xdotool を使用して、名前、ウィンドウ クラスなどでウィンドウを検索できます。ウィンドウを名前で検索するには、次を使用します。

xdotool search --name 'My Window Name'

これにより、10 進数のウィンドウ ID が標準出力に出力されます。--name フラグは、ウィンドウ名の一部または全部に一致します。ブラウザーでは、通常、現在のタブ名が含まれます。xdotool は、次のように対応する pid を返すこともできます。

xdotool search --name 'My Window Title' getwindowpid

彼は、一連のキープレスとマウスクリックをウィンドウに送信する例です。

# Find window with title containing 'My Window Title, activate it,
# move the mouse to coordinates 200x400, left click, then press F5
xdotool search --name 'My Window Title' windowactivate mousemove 200 400 click 1 key F5
# Store window id of the active window
WINDOW_ID=$(xdotool getactivewindow)
# Type a series of characters into the window
xdotool type "this text is being typed into window" --window $A
于 2020-05-10T00:42:09.993 に答える
1

awkの出力から ID を抽出するために使用できますwmctrl -l

例えば:

wmctrl -l | awk '/Google Chrome/ {print $1}'

xdotoolおそらくその16進IDは問題なく使用できますが、それができない場合は、次の方法で10進表現に変換できますstrtonum

wmctrl -l | awk '/Google Chrome/ {print strtonum($1)}'

出力から必要なウィンドウだけをどのように一致awkさせるかは、あなたとあなたの要件次第です。

操作したいウィンドウのウィンドウ ID を取得するために使用できるあらゆる種類の指定子とパターンを取るコマンドxdotoolもあるように見えることは、おそらく注目に値します。search(「連鎖コマンド」を直接操作するための「ウィンドウ ID」の特別な形式をサポートする一致のスタックもサポートします。)

于 2016-01-14T18:46:54.700 に答える
0

Linux システムを実行していて、x-display manager を使用している場合、xwininfoウィンドウ情報を取得するコマンドが機能する場合があります。

コマンドを実行またはスクリプトxwininfo -root -tree化して、xwindows システムとウィンドウ ID の詳細で整理された出力を取得できます。xwininforunescape 用に作成した小さなボットで出力をどのように使用したかを見ることができます。ウィンドウ タイトルの 16 進数の ID を保存し、printf %i関心のあるウィンドウの 16 進数を使用してバイナリに変換します。そこから、スクリプトxdotoolを実行して、ウィンドウをアクティブなウィンドウにし、を使用してマウスを移動しますxdotool

ここに画像の説明を入力

したがって、この方法の手順は次のとおりです。

  1. を使用してウィンドウ情報を取得しますxwininfo -root -tree

  2. 関心のあるウィンドウ ID を保存します。木。)
  3. ウィンドウの 16 進 ID をxdotool認識できるように 2 進数に変換します。
  4. 正しいウィンドウと対話するには、withwindowactivateオプションを使用します。xdotoolxdotool
  5. 必要な次のステップを実行します。

したがって、最初は少し時間がかかりますが、非常に単純ですが、親ウィンドウの 16 進 ID を格納する独自の方法を開発すると、残りは簡単に自動化でき、心配はありません。親ウィンドウに属している 16 進 ID を特定できない場合は、親プロセスと子プロセスを確認する方法がありますが、そのすべてを調べたいかどうかはわかりません。その情報を含めてほしい場合は、コメントしてください。

これがお役に立てば幸いです。

于 2020-02-15T09:34:16.597 に答える