linux 如何自动获取xdotool窗口ID

xzv2uavs  于 2023-02-21  发布在  Linux
关注(0)|答案(4)|浏览(466)

我正在尝试自动化测试表单, selenium 将花费太长的时间(javascript沉重的现代表单),我想使用xdotool并获得窗口ID。我看到你可以调用xdotool selectwindow并单击它,但随后你必须每次单击它。我想告诉它“对于标签标题为x的谷歌chrome窗口,请执行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是一个很棒的工具,但是窗口操作期望你对窗口有很多了解,从我以前使用它的记忆来看,www.example.com的X11M1N1X部分https://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
...

把第一个用空格隔开的数字取到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'
l7mqbcuq

l7mqbcuq1#

可以按名称、窗口类等查找具有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
pb3s4cty

pb3s4cty2#

您可以使用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(它甚至支持一个匹配堆栈,它支持一种特殊格式的"窗口ID"来直接操作"链式命令")。

xggvc2p6

xggvc2p63#

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

因此,该方法的步骤如下:
1.使用xwininfo -root -tree获取窗口信息。
1.存储您感兴趣的窗口ID。(可能有多个窗口名称列表,它们具有不同的十六进制ID,您必须知道父十六进制ID,它通常是第一个列出的,并且通常概述了
子树)。
1.将窗口十六进制ID转换为二进制,以便xdotool可以识别它。
1.将windowactivate选项与xdotool配合使用,以使xdotool与正确的窗口交互。
1.执行您希望执行的任何后续步骤。
所以这真的很简单,虽然一开始有点耗时,但是一旦你开发了自己的方法来存储父窗口的十六进制ID,剩下的就可以很容易地自动化,不用担心了。如果你在确定哪个十六进制ID属于父窗口时遇到麻烦,有检查父进程与子进程的方法,但我不知道你是否想进入所有这些。如果你想让我包括这些信息,请发表评论。
希望这对你有帮助。

31moq8wy

31moq8wy4#

@Yokai显然gnome不支持xdotool
$ xdotool窗口激活“$窗口ID十进制”
您的窗口管理器声明不支持_NET_ACTIVE_WINDOW,因此激活窗口的尝试被中止。窗口上的xdo_activate_window:########报告了一个错误

相关问题