【问题标题】:how do you get window ID for xdotool automatically如何自动获取 xdotool 的窗口 ID
【发布时间】:2016-03-16 10:45:11
【问题描述】:

我正在尝试自动化测试 selenium 需要很长时间的表单(javascript 繁重的现代表单),我想使用 xdotool 并获取窗口 ID。我看到您可以致电xdotool selectwindow 并单击它,但是您每次都必须单击它。我想告诉它“对于标签标题为 x 的 google chrome windows,请执行 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 是一个很棒的工具,但是窗口操作需要你对窗口有很多了解,从我记得以前使用它的情况来看,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'

【问题讨论】:

  • 65011713 是一个二进制值。从wmctrl 返回的值是十六进制值。您需要转换以使它们匹配(尽管这三个都没有,但我在该列表中根本看不到chrome)。不过,ps 中的任何内容都与此无关。如果您无法获取选项卡的单个窗口 ID(您可能无法获取),那么您可能无法专门针对选项卡(或者甚至必须查看带有xdotool 的选项卡首先)。 (可能值得查看xwininfo -tree 的输出,看看您是否可以在那里找到所需的内容。)
  • 是的,没错,这很麻烦,但它解决了它
  • 如果您希望我选择它,请将您的问题表述为问题。在花花公子投票结束这个特定的事情时,我几乎把我的脾脏翻了个底朝天。
  • 您刚刚用自己制定的答案更新了您的问题吗?
  • 使用 selenium,您可以在选项卡之间切换。 stackoverflow.com/questions/12729265/…

标签: linux bash scripting ps xdotool


【解决方案1】:

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

xdotool search --name 'My Window Name'

这会将十进制窗口 id 打印到标准输出。 --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】:

    您可以使用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”,可以直接对“链式命令”进行操作。)

    【讨论】:

      【解决方案3】:

      如果您运行的是 linux 系统并使用 x-display 管理器,那么获取窗口信息的命令 xwininfo 可能对您有用。

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

      所以这个方法的步骤是:

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

      所以这真的很简单,虽然一开始有点费时,但是一旦你开发了自己的方法来存储父窗口的十六进制ID,剩下的就可以轻松自动化了,不用担心。如果您在确定哪个十六进制 ID 属于父窗口时遇到问题,可以通过一些方法来检查父进程与子进程,但我不知道您是否想了解所有这些。如果您希望我包含该信息,请发表评论。

      我希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-14
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多