你如何自动获得 xdotool 的 window ID

how do you get window ID for xdotool automatically

我正在尝试自动测试硒会花费太长时间的表单(javascript 繁重的现代表单),我想使用 xdotool 并获取 window ID。我看到您可以调用 xdotool selectwindow 并单击它,但是每次都必须单击它。我想告诉它"for google chrome windows where the tab title is x, do y"

我在这里得到了 window ID:

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

这是针对 chrome 本身的,单击时每个选项卡都会获得相同的值。所以我希望在 ps 或 window 经理中找到它,但没有:

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 操作需要您对 windows 有很多了解,而根据我之前使用它的记忆,[=19= 的 WINDOW COMMANDS 部分] 有很多方法可以找到您非常了解的 window,但在自动获取 window 信息方面却不多。我如何自动确定 window 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
...

并获取由 space 分隔的第一个数字到 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'

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

例如:

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

xdotool 可能会采用十六进制 ID,但如果不能,您可以使用 strtonum:

将其转换为十进制表示形式
wmctrl -l | awk '/Google Chrome/ {print strtonum()}'

如何匹配 只是 您想要从 awk 的输出中得到的 window 取决于您和您的要求。

可能值得注意的是 xdotool 似乎也有一个 search 命令,它采用各种说明符和模式,您可以使用它们来获取 window ID windows你要手术。 (它甚至支持一堆匹配,它支持一种特殊格式 "window ID" 直接对 "chained commands" 进行操作。)

如果您运行正在使用 linux 系统并使用 x-display 管理器,则命令 xwininfo 获取 window 信息可能适合您.

您可以 运行 或编写命令 xwininfo -root -tree 并获得 xwindows 系统和 window ID 的详细且有条理的输出。您可以看到我如何在为 运行escape 创建的小型机器人中使用 xwininfo 输出。我存储 window 标题的十六进制 ID,然后使用 printf %i 和我感兴趣的 window 的十六进制将其转换为二进制。从那里,我可以编写脚本 xdotool 通过 window 激活 window 并使用 xdotool.

将鼠标移动到 window 中或使用 window 做任何我想做的

所以这个方法的步骤是:

  1. 使用xwininfo -root -tree获取window信息。
  2. 存储您感兴趣的window ID。 (window 名称可能有多个不同的列表 十六进制 ID,您将必须知道 parent 十六进制 ID,它是 通常第一个列出并通常概述
    中的 child 个过程 一个sub-tree.)
  3. 将 window 十六进制 ID 转换为二进制,以便 xdotool 可以识别它。
  4. windowactivate 选项与 xdotool 结合使用以获得 xdotool 与正确的 window.
  5. 互动
  6. 执行您希望的任何后续步骤。

所以真的很简单,虽然一开始有点time-consuming,但是一旦你开发了自己的方法来存储parent window的十六进制ID,剩下的就可以了很容易实现自动化,不用担心。如果您无法确定哪个十六进制 ID 属于 parent window,有一些方法可以检查 parent 与 child 进程,但我不知道您是否想要进入所有这些。如果您希望我包含该信息,请发表评论。

希望对您有所帮助。

您可以使用 xdotool 按名称查找 window,window class 等。要按名称搜索 window,请使用:

xdotool search --name 'My Window Name'

这会将十进制的 window id 打印到标准输出。 --name 标志匹配 window 名称的部分或全部。在浏览器中,这通常包括当前选项卡名称。 xdotool也可以像这样return对应的pid:

xdotool search --name 'My Window Title' getwindowpid

他是将一系列按键和鼠标点击发送到 window 的示例。

# 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