package main import ( "bytes" "fmt" "io/ioutil" "net/http" "time" "github.com/tidwall/gjson" ) func main() { // 查找设备 resp, err := http.Get("http://localhost:5037/devices") if err != nil { panic(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { panic(err) } // 解析设备信息 serial := gjson.GetBytes(body, "devices.0.serial").String() // 连接设备 resp, err = http.Post(fmt.Sprintf("http://localhost:5037/devices/%s/connect", serial), "", nil) if err != nil { panic(err) } defer resp.Body.Close() // 获取应用程序内容页信息 resp, err = http.Post(fmt.Sprintf("http://localhost:5037/devices/%s/activities", serial), "application/json", bytes.NewBufferString(`{"package":"com.example.myapp"}`)) if err != nil { panic(err) } defer resp.Body.Close() body, err = ioutil.ReadAll(resp.Body) if err != nil { panic(err) } // 解析应用程序内容页信息 layout := gjson.GetBytes(body, "layout") // 查找关闭按钮位置 var x, y int layout.ForEach(func(key, value gjson.Result) bool { if value.Get("class").String() == "android.widget.Button" && value.Get("text").String() == "Close" { x = int(value.Get("bounds.0").Float()) y = int(value.Get("bounds.1").Float()) return false } return true }) // 发送模拟点击指令 cmd := fmt.Sprintf("input tap %d %d", x, y) resp, err = http.Post(fmt.Sprintf("http://localhost:5037/devices/%s/shell", serial), "application/octet-stream", bytes.NewBufferString(cmd)) if err != nil { panic(err) } defer resp.Body.Close() // 等待点击操作完成 time.Sleep(time.Second) }