xdotool 全面指南:Linux 桌面自动化终极工具

xdotool 是一个强大的命令行工具,用于在 Linux 系统上自动化桌面交互。它可以模拟键盘输入、鼠标移动/点击、窗口操作等,是自动化测试、宏创建和辅助功能的理想选择。

一、核心功能概览

功能类别 主要命令 描述
鼠标控制 mousemove, click, mousedown, mouseup 控制鼠标位置和点击
键盘模拟 type, key, keydown, keyup 模拟键盘输入和按键
窗口操作 search, windowactivate, windowsize, windowmove 查找和控制窗口
实用工具 getwindowfocus, getmouselocation, getwindowgeometry 获取系统状态信息
高级功能 behave, exec, sleep 创建复杂行为链

二、安装与基础用法

安装方法

bash
复制
# Debian/Ubuntu
sudo apt install xdotool

# Fedora
sudo dnf install xdotool

# Arch Linux
sudo pacman -S xdotool

基本命令结构

bash
复制
xdotool [选项] <命令> [参数]

三、鼠标控制详解

1. 移动鼠标

bash
复制
# 移动到绝对坐标 (X,Y)
xdotool mousemove 100 200

# 相对移动
xdotool mousemove_relative 50 -30

# 使用屏幕编号 (多显示器)
xdotool mousemove --screen 1 300 400

2. 鼠标点击

bash
复制
# 左键单击 (按钮1)
xdotool click 1

# 右键单击 (按钮3)
xdotool click 3

# 双击
xdotool click --repeat 2 1

# 按下和释放分开控制
xdotool mousedown 1
sleep 0.5
xdotool mouseup 1

3. 鼠标拖动

bash
复制
# 拖动示例
xdotool mousemove 100 100
xdotool mousedown 1
xdotool mousemove_relative 200 0
xdotool mouseup 1

四、键盘控制详解

1. 文本输入

bash
复制
# 直接输入文本
xdotool type "Hello World!"

# 带延迟的输入 (毫秒)
xdotool type --delay 100 "Slow typing"

# 特殊字符需要转义
xdotool type 'Exclamation\! Question\?'

2. 按键模拟

bash
复制
# 单个按键
xdotool key a
xdotool key Return

# 组合键
xdotool key ctrl+c
xdotool key alt+Tab

# 按键序列
xdotool key Up Up Down Down Left Right Left Right B A

3. 长按控制

bash
复制
# 按下Ctrl
xdotool keydown ctrl

# 按V键
xdotool key v

# 释放Ctrl
xdotool keyup ctrl

五、窗口操作详解

1. 查找窗口

bash
复制
# 按标题查找
xdotool search --name "Firefox"

# 按类名查找
xdotool search --class "terminal"

# 按PID查找
xdotool search --pid 1234

# 组合条件
xdotool search --onlyvisible --name "Document"

2. 窗口控制

bash
复制
# 激活窗口
xdotool windowactivate $(xdotool search --name "Calculator")

# 关闭窗口
xdotool windowclose $WINDOWID

# 最大化窗口
xdotool windowsize $WINDOWID 100% 100%

# 调整窗口大小
xdotool windowsize $WINDOWID 800 600

# 移动窗口
xdotool windowmove $WINDOWID 0 0

3. 焦点控制

bash
复制
# 获取当前焦点窗口
xdotool getwindowfocus

# 设置焦点窗口
xdotool windowfocus $WINDOWID

# 设置焦点并激活
xdotool windowactivate --sync $WINDOWID

六、实用工具命令

1. 获取鼠标信息

bash
复制
# 获取当前鼠标位置
xdotool getmouselocation

# 输出格式: x:100 y:200 screen:0 window:12345678

# 获取带详细信息的鼠标位置
xdotool getmouselocation --shell
# 输出:
# X=100
# Y=200
# SCREEN=0
# WINDOW=12345678

2. 获取窗口信息

bash
复制
# 获取窗口几何信息
xdotool getwindowgeometry $WINDOWID

# 输出:
# 窗口 12345678
# 位置: 100,200 (屏幕: 0)
# 大小: 800x600

# 获取窗口名称
xdotool getwindowname $WINDOWID

七、高级用法与脚本编写

1. 命令链执行

bash
复制
# 单行执行多个命令
xdotool key ctrl+alt+t sleep 1 type 'htop' sleep 0.5 key Return

2. 窗口行为绑定

bash
复制
# 当鼠标进入窗口时执行命令
xdotool behave $WINDOWID mouse-enter exec xdotool key F11

3. 完整自动化脚本示例

bash
复制
#!/bin/bash

# 打开终端
xdotool key ctrl+alt+t
sleep 1

# 输入命令并执行
xdotool type "echo '自动化测试开始'"
xdotool key Return
sleep 0.5

# 打开Firefox
xdotool key super
sleep 0.5
xdotool type "firefox"
sleep 0.5
xdotool key Return
sleep 2

# 在新标签页打开网页
xdotool key ctrl+t
sleep 1
xdotool type "https://www.example.com"
xdotool key Return

八、实用技巧与注意事项

1. 精确时间控制

bash
复制
# 使用usleep实现毫秒级延迟
xdotool mousemove 100 100
usleep 500000  # 500毫秒
xdotool click 1

2. 焦点窗口安全操作

bash
复制
# 保存当前焦点窗口
CURRENT_WIN=$(xdotool getwindowfocus)

# 操作其他窗口
xdotool windowactivate --sync $TARGET_WIN
xdotool type "Hello"

# 恢复原焦点
xdotool windowactivate --sync $CURRENT_WIN

3. 多显示器支持

bash
复制
# 获取屏幕信息
xrandr | grep " connected"

# 在指定屏幕操作
xdotool mousemove --screen 1 100 100

4. 常见问题解决

问题:命令执行太快

bash
复制
# 在命令间添加延迟
xdotool key ctrl+t sleep 0.5 type "url" sleep 0.2 key Return

问题:特殊字符处理

bash
复制
# 使用单引号和转义
xdotool type 'Special characters: \! @ # $ % ^ & * ( )'

问题:Wayland兼容性

bash
复制
# 切换到Xorg会话或在脚本前添加:
export XDG_SESSION_TYPE=x11

九、与其他工具集成

1. 结合 wmctrl

bash
复制
# 获取活动窗口ID
ACTIVE_WIN=$(wmctrl -a :ACTIVE: -v 2>&1 | grep "Using window" | awk '{print $4}')

# 最大化活动窗口
xdotool windowsize $ACTIVE_WIN 100% 100%

2. 结合 scrot 截图

bash
复制
# 选择区域截图
xdotool mousemove 100 100 mousedown 1 mousemove 300 300 mouseup 1
sleep 0.5
scrot -s area.png

3. 结合 notify-send 通知

bash
复制
# 脚本完成后发送通知
xdotool type "任务完成!"
notify-send "自动化" "脚本执行完毕"

十、典型应用场景

  1. 自动化测试:重复执行UI操作序列
  2. 宏创建:一键执行复杂操作链
  3. 辅助功能:为行动不便用户创建控制脚本
  4. 批量操作:同时控制多个窗口
  5. 演示录制:精确控制演示流程
  6. 游戏自动化:模拟重复操作
  7. 远程控制:通过SSH控制桌面

总结

xdotool 是一个功能强大且灵活的桌面自动化工具,通过掌握其核心功能和高级技巧,你可以:

  1. 自动化重复性桌面任务
  2. 创建复杂的交互脚本
  3. 集成到CI/CD流程进行UI测试
  4. 开发辅助功能工具
  5. 提高工作效率

虽然 xdotool 在 Wayland 环境下的支持有限,但在 X11 环境中它仍然是功能最全面的桌面自动化工具之一。结合其他 Linux 工具如 wmctrlscrotnotify-send,可以构建出强大的桌面自动化解决方案。