你如何自动获得xdotool的窗口ID

时间:2015-12-10 17:20:25

标签: linux bash scripting ps xdotool

我正在尝试自动化测试表单,其中selenium需要太长时间(javascript繁重的现代表单),并且我想使用xdotool并获取窗口ID。我看到你可以拨打xdotool selectwindow并点击它,但之后你必须每次都点击它。我想告诉它"对于标签标题为x的谷歌浏览器窗口,请执行y"

我在这里得到了窗口ID:

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

这适用于chrome本身,每个标签在点击时都会获得相同的值。所以我希望在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是一个很棒的工具,但是窗口操作希望你对windows有很多了解,而且从我以前记得使用它的过程来看,https://www.semicomplete.com/projects/xdotool/xdotool.xhtml#window_commandsWINDOW COMMANDS部分有很多方法可以找到一个你了解很多的窗口,但没有太多关于自动获取窗口信息的方式。如何自动确定窗口ID(xdotool想要的格式),比如通过向脚本提供URL的开头部分?谢谢

您可以在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标志告诉它期望十六进制

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'

3 个答案:

答案 0 :(得分:1)

您可以使用awkwmctrl -l的输出中提取ID。

例如:

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

xdotool可能会很好地接受十六进制ID,但是如果它不能用strtonum将其转换为十进制表示:

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

如何匹配 所需的窗口awk中的输出取决于您和您的要求。

值得注意的是xdotool似乎也有一个search命令,它可以使用各种说明符和模式来获取你想要操作的窗口的窗口ID。 (它甚至支持一堆匹配,它支持特殊格式的&#34;窗口ID&#34;直接操作&#34;链式命令&#34;。)

答案 1 :(得分:1)

您可以通过名称,窗口类等找到带有xdotool的窗口。要使用名称来搜索窗口,请使用:

xdotool search --name 'My Window Name'

这会将十进制窗口ID打印到stdout。 --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

答案 2 :(得分:0)

如果您正在运行linux系统并使用x-display Manager,则获取窗口信息的命令xwininfo可能对您有用。

您可以运行或编写命令xwininfo -root -tree并获取xwindows系统和窗口ID的详细且有组织的输出。您可以看到如何在我为runescape创建的小型机器人中使用xwininfo输出。我存储窗口标题的十六进制ID,然后使用printf %i和感兴趣的窗口十六进制将其转换为二进制。从那里,我可以编写xdotool脚本以执行我想在其中执行的任何操作,或者将该窗口设为活动窗口,然后使用xdotool将鼠标移到该窗口上。

enter image description here

因此,此方法的步骤为:

  1. 使用xwininfo -root -tree获取窗口信息。
  2. 存储您感兴趣的窗口ID。 (窗口名称可能有多个列表,但列表名称不同 十六进制ID,您将必须知道父十六进制ID 通常首先列出,并通常概述以下子进程: 子树。)
  3. 将窗口十六进制ID转换为二进制,以便xdotool可以识别它。
  4. windowactivate选项与xdotool一起使用以获得xdotool 与正确的窗口进行交互。
  5. 执行所需的下一步操作。

这真的很简单,虽然起初有点耗时,但是一旦您开发了自己的用于存储父窗口的十六进制ID的方法,其余的就可以轻松实现自动化,并且不会产生任何麻烦。如果您在确定哪个十六进制ID属于父窗口时遇到麻烦,可以使用多种方法来检查父进程与子进程,但是我不知道您是否要全部讨论。如果您要我包含这些信息,请发表评论。

我希望这会有所帮助。