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

cod*_*321 5 linux bash scripting ps xdotool

我正在尝试自动化 selenium 需要太长时间的测试表单(javascript 重型现代表单),我想使用 xdotool 并获取窗口 ID。我看到您可以调用xdotool selectwindow并单击它,但是您每次都必须单击它。我想告诉它“对于标签标题为 x 的 google chrome 窗口,请执行 y”

我在这里得到了窗口 ID:

cchilders@cchilders-Dell-Precision-M3800:~$ xdotool selectwindow
65011713
Run Code Online (Sandbox Code Playgroud)

这是针对 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
Run Code Online (Sandbox Code Playgroud)

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...
Run Code Online (Sandbox Code Playgroud)

65011713 无处出现。Xdotool 是一个很棒的工具,但是窗口操作希望你对窗口有很多了解,从我之前使用它的记忆来看WINDOW COMMANDShttps: //www.semicomplete.com/projects/xdotool/xdotool.xhtml 的部分#window_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
...
Run Code Online (Sandbox Code Playgroud)

并将由空格分隔的第一个数字获取到 int:

In [13]: int("0x03e00001", 16)
Out[13]: 65011713
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

小智 7

您可以使用 xdotool 按名称、窗口类等查找窗口。要按名称搜索窗口,请使用:

xdotool search --name 'My Window Name'
Run Code Online (Sandbox Code Playgroud)

这会将十进制窗口 ID 打印到标准输出。--name 标志与窗口名称的部分或全部匹配。在浏览器中,通常包括当前选项卡名称。xdotool还可以像这样返回相应的pid:

xdotool search --name 'My Window Title' getwindowpid
Run Code Online (Sandbox Code Playgroud)

他是向窗口发送一系列按键和鼠标单击的示例。

# 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
Run Code Online (Sandbox Code Playgroud)


Eta*_*ner 3

您可以使用awk从 的输出中提取 ID wmctrl -l

例如:

wmctrl -l | awk '/Google Chrome/ {print $1}'
Run Code Online (Sandbox Code Playgroud)

xdotool可能会很好地使用十六进制 ID,但如果不能,您可以使用以下命令将其转换为十进制表示形式strtonum

wmctrl -l | awk '/Google Chrome/ {print strtonum($1)}'
Run Code Online (Sandbox Code Playgroud)

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

可能值得注意的是,xdotool似乎还有一个search命令,它采用各种说明符和模式,您可以使用它们来获取要操作的窗口的窗口 ID。(它甚至支持一堆匹配,它支持特殊格式的“窗口 ID”以直接操作“链接命令”。)