我正在尝试自动测试硒会花费很长时间的表单(JavaScript繁重的现代表单),我想使用xdotool并获取窗口ID。我看到您可以调用xdotool selectwindow
并单击它,但是每次都必须单击它。我想告诉它“对于选项卡标题为x的google 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是一个很棒的工具,但是窗口操作希望您对窗口有很多了解,并且根据我以前使用它的经验,WINDOW COMMANDS
的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'
您可以使用awk
从wmctrl -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”的特殊格式,可直接对“链接的命令”进行操作。)
如果您正在运行linux系统并使用x-display管理器,则可能会使用命令xwininfo
获取窗口信息。
您可以运行或编写命令xwininfo -root -tree
并获取xwindows系统和窗口ID的详细且有组织的输出。您可以看到我如何在为runescape创建的小型机器人中使用xwininfo
输出。我存储窗口标题的十六进制ID,然后使用printf %i
和我感兴趣的窗口的十六进制将其转换为二进制。从那里,我可以编写xdotool
的脚本,以通过将其设置为活动窗口,然后使用xdotool
将鼠标移至该窗口。
因此,此方法的步骤是:
xwininfo -root -tree
获取窗口信息。xdotool
可以识别它。windowactivate
一起使用xdotool
选项以获取xdotool
与正确的窗口进行交互。因此,它实际上非常简单,尽管起初有点耗时,但是一旦您开发了自己的用于存储父窗口的十六进制ID的方法,其余的就可以轻松实现自动化,并且不会产生任何麻烦。如果您在确定哪个十六进制ID属于父窗口时遇到麻烦,可以使用多种方法来检查父进程与子进程,但我不知道您是否要全部进行。如果您要我包含这些信息,请发表评论。
我希望这会有所帮助。