项目作者: electricbubble

项目描述 :
appium-uiautomator2-server ( Android ) Client Library in Golang
高级语言: Go
项目地址: git://github.com/electricbubble/guia2.git
创建时间: 2020-08-06T00:01:56Z
项目社区:https://github.com/electricbubble/guia2

开源协议:MIT License

下载


Golang-UIAutomator2

go doc
license

使用 Golang 实现 appium/appium-uiautomator2-server 的客户端库

扩展库

如果使用 IOS 设备, 可查看 electricbubble/gwda

安装

  1. go get github.com/electricbubble/guia2

使用

首次使用需要在 Android 设备中安装两个 apk
appium-uiautomator2-server-debug-androidTest.apk
appium-uiautomator2-server-vXX.XX.XX.apk

apk 可以选择通过 appium/appium-uiautomator2-server 进行构建
也可以直接从这里下载 electricbubble/appium-uiautomator2-server-apk

再通过 adb 启动 appium-uiautomator2-server
```shell script
adb shell am instrument -w io.appium.uiautomator2.server.test/androidx.test.runner.AndroidJUnitRunner

⬇️ 后台运行

adb shell “nohup am instrument -w io.appium.uiautomator2.server.test/androidx.test.runner.AndroidJUnitRunner >/sdcard/uia2server.log 2>&1 &”

or

adb -s $serial shell “nohup am instrument -w io.appium.uiautomator2.server.test/androidx.test.runner.AndroidJUnitRunner >/sdcard/uia2server.log 2>&1 &”
```

guia2.NewUSBDriver()

该函数使用期间, Android 设备必须一直保持 USB 的连接 (模拟器 也使用该函数)

guia2.NewWiFiDriver("192.168.1.28")

  1. 先通过 USB 连接 Android 设备
  2. 让设备在 5555 端口监听 TCP/IP 连接
    ```shell script
    adb tcpip 5555

    or

    adb -s $serial tcpip 5555
    ```
  3. 查询 Android 设备的 IP (这一步骤开始可选择断开 USB 连接)
  4. 通过 IP 连接 Android 设备
    shell script adb connect $deviceIP
  5. 确认连接状态
    ```shell script
    adb devices
    1. 看到以下格式的设备, 说明连接成功
    2. ```shell script
    3. $deviceIP:5555 device
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/electricbubble/guia2"
  5. "io/ioutil"
  6. "log"
  7. "os"
  8. )
  9. func main() {
  10. driver, err := guia2.NewUSBDriver()
  11. // driver, err := guia2.NewWiFiDriver("192.168.1.28")
  12. checkErr(err)
  13. defer func() { _ = driver.Dispose() }()
  14. // err = driver.AppLaunch("tv.danmaku.bili")
  15. err = driver.AppLaunch("tv.danmaku.bili", guia2.BySelector{ResourceIdID: "tv.danmaku.bili:id/action_bar_root"})
  16. checkErr(err, "launch the app until the element appears")
  17. // fmt.Println(driver.Source())
  18. // return
  19. deviceSize, err := driver.DeviceSize()
  20. checkErr(err)
  21. var startX, startY, endX, endY int
  22. startX = deviceSize.Width / 2
  23. startY = deviceSize.Height / 2
  24. endX = startX
  25. endY = startY / 2
  26. err = driver.Swipe(startX, startY, endX, endY)
  27. checkErr(err)
  28. var startPoint, endPoint guia2.PointF
  29. startPoint = guia2.PointF{X: float64(startX), Y: float64(startY)}
  30. endPoint = guia2.PointF{X: startPoint.X, Y: startPoint.Y * 1.6}
  31. err = driver.SwipePointF(startPoint, endPoint)
  32. checkErr(err)
  33. element, err := driver.FindElement(guia2.BySelector{ResourceIdID: "tv.danmaku.bili:id/expand_search"})
  34. checkErr(err)
  35. err = element.Click()
  36. checkErr(err)
  37. bySelector := guia2.BySelector{UiAutomator: guia2.NewUiSelectorHelper().Focused(true).String()}
  38. element, err = waitForElement(driver, bySelector)
  39. checkErr(err)
  40. err = element.SendKeys("雾山五行")
  41. checkErr(err)
  42. err = driver.PressKeyCode(guia2.KCEnter, guia2.KMEmpty)
  43. checkErr(err)
  44. bySelector = guia2.BySelector{UiAutomator: guia2.NewUiSelectorHelper().TextStartsWith("番剧").String()}
  45. element, err = waitForElement(driver, bySelector)
  46. checkErr(err)
  47. checkErr(element.Click())
  48. bySelector = guia2.BySelector{UiAutomator: guia2.NewUiSelectorHelper().Text("立即观看").String()}
  49. element, err = waitForElement(driver, bySelector)
  50. checkErr(err)
  51. checkErr(element.Click())
  52. bySelector = guia2.BySelector{ResourceIdID: "tv.danmaku.bili:id/videoview_container_space"}
  53. element, err = waitForElement(driver, bySelector)
  54. checkErr(err)
  55. // time.Sleep(time.Second * 5)
  56. screenshot, err := element.Screenshot()
  57. checkErr(err)
  58. userHomeDir, _ := os.UserHomeDir()
  59. checkErr(ioutil.WriteFile(userHomeDir+"/Desktop/element.png", screenshot.Bytes(), 0600))
  60. err = driver.PressKeyCode(guia2.KCMediaPause, guia2.KMEmpty)
  61. checkErr(err)
  62. err = driver.PressBack()
  63. checkErr(err)
  64. }
  65. func waitForElement(driver *guia2.Driver, bySelector guia2.BySelector) (element *guia2.Element, err error) {
  66. var ce error
  67. exists := func(d *guia2.Driver) (bool, error) {
  68. element, ce = d.FindElement(bySelector)
  69. if ce == nil {
  70. return true, nil
  71. }
  72. // 如果直接返回 error 将直接终止 `driver.Wait`
  73. return false, nil
  74. }
  75. if err = driver.Wait(exists); err != nil {
  76. return nil, fmt.Errorf("%s: %w", err.Error(), ce)
  77. }
  78. return
  79. }
  80. func checkErr(err error, msg ...string) {
  81. if err == nil {
  82. return
  83. }
  84. var output string
  85. if len(msg) != 0 {
  86. output = msg[0] + " "
  87. }
  88. output += err.Error()
  89. log.Fatalln(output)
  90. }

感谢小伙伴提供的 红米 Note 5A

example

Thanks

Thank you JetBrains for providing free open source licenses