golang基于容器化技术的Selenium Hub替代方案插件selenoid的使用

Golang基于容器化技术的Selenium Hub替代方案插件Selenoid的使用

什么是Selenoid

Selenoid是一个强大的Selenium hub实现,使用Docker容器来启动浏览器。它相比传统的Selenium服务器有以下优势:

  • 轻量快速:内存消耗比Java版Selenium服务器少10倍,仅6MB大小的二进制文件
  • 开箱即用的浏览器镜像:无需手动安装浏览器
  • 实时浏览器屏幕和日志查看
  • 视频录制功能
  • 方便的日志记录
  • 完全隔离和可重现的环境

主要特性

一键安装

只需下载Configuration Manager二进制文件并运行一个命令即可启动浏览器自动化:

$ ./cm selenoid start --vnc --tmpfs 128

安装完成后,可以在测试中使用以下Selenium URL:

http://localhost:4444/wd/hub

现成的浏览器镜像

无需手动安装浏览器或研究WebDriver文档。Selenoid提供了多种现成的浏览器镜像,新版本发布后会立即添加新镜像。

实时浏览器屏幕和日志

提供丰富的用户界面,显示浏览器屏幕和Selenium会话日志。

视频录制

  • 任何浏览器会话都可以保存为H.264视频
  • 提供API来列出、下载和删除录制的视频文件

方便的日志记录

  • 所有浏览器会话日志自动保存到文件(每个会话一个文件)
  • 提供API来列出、下载和删除保存的日志文件

Golang中使用Selenoid示例

以下是一个完整的Golang示例,展示如何使用Selenoid进行浏览器自动化测试:

package main

import (
	"fmt"
	"time"
	
	"github.com/tebeka/selenium"
)

func main() {
	// 设置Selenoid的Selenium服务器地址
	const (
		seleniumPath = "http://localhost:4444/wd/hub"
	)
	
	// 配置浏览器能力
	caps := selenium.Capabilities{
		"browserName": "chrome",
		"version":     "latest",
		"platform":    "LINUX",
		"enableVNC":   true,  // 启用VNC以便查看浏览器
		"enableVideo": true,  // 启用视频录制
	}
	
	// 连接到Selenoid
	wd, err := selenium.NewRemote(caps, seleniumPath)
	if err != nil {
		panic(fmt.Sprintf("Failed to open session: %s\n", err))
	}
	defer wd.Quit()
	
	// 导航到测试页面
	err = wd.Get("https://www.example.com")
	if err != nil {
		panic(fmt.Sprintf("Failed to load page: %s\n", err))
	}
	
	// 执行一些测试操作
	title, err := wd.Title()
	if err != nil {
		panic(fmt.Sprintf("Failed to get page title: %s\n", err))
	}
	fmt.Printf("Page title: %s\n", title)
	
	// 等待以便查看结果
	time.Sleep(5 * time.Second)
	
	fmt.Println("Test completed successfully")
}

安装和配置

  1. 首先安装Docker并确保它正在运行
  2. 下载并运行Selenoid配置管理器:
curl -s https://aerokube.com/cm/bash | bash \
&& ./cm selenoid start --vnc --tmpfs 128
  1. 验证Selenoid是否运行:
docker ps

你应该能看到Selenoid容器正在运行。

注意事项

  • Selenoid最初是为在硬件服务器或虚拟机上部署而创建的,不适合Kubernetes
  • 如果需要Kubernetes中运行Selenium测试,可以考虑使用Moon(Selenoid的Kubernetes专用解决方案)

总结

Selenoid提供了一个轻量级、高性能的Selenium Hub替代方案,特别适合Golang开发者使用。通过Docker容器化技术,它简化了浏览器自动化测试的设置和维护工作,同时提供了丰富的功能如视频录制和实时监控。


更多关于golang基于容器化技术的Selenium Hub替代方案插件selenoid的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang基于容器化技术的Selenium Hub替代方案插件selenoid的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang中使用Selenoid作为Selenium Hub的替代方案

Selenoid是一个轻量级的Selenium Hub实现,基于Docker容器技术,可以替代传统的Selenium Grid。它提供了更快的启动时间和更高效的资源利用。下面我将介绍如何在Golang项目中使用Selenoid。

1. Selenoid简介

Selenoid的主要特点:

  • 基于Docker容器运行浏览器
  • 支持最新浏览器版本
  • 配置简单
  • 资源占用低
  • 支持视频录制
  • 提供UI管理界面

2. 安装和配置Selenoid

2.1 安装Docker

首先确保系统已安装Docker:

# Ubuntu示例
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

2.2 下载Selenoid

curl -s https://aerokube.com/cm/bash | bash \
&& ./cm selenoid start --vnc

2.3 配置浏览器镜像

编辑config/browsers.json

{
    "chrome": {
        "default": "latest",
        "versions": {
            "latest": {
                "image": "selenoid/chrome:latest",
                "port": "4444",
                "path": "/"
            }
        }
    }
}

3. Golang中使用Selenoid

3.1 安装必要的依赖

go get github.com/tebeka/selenium

3.2 示例代码

package main

import (
	"fmt"
	"log"
	"time"

	"github.com/tebeka/selenium"
	"github.com/tebeka/selenium/chrome"
)

const (
	// Selenoid地址
	selenoidURL = "http://localhost:4444/wd/hub"
	// 浏览器类型
	browser = "chrome"
)

func main() {
	// 设置Chrome选项
	caps := selenium.Capabilities{
		"browserName": browser,
		"version":     "latest",
	}
	
	// 添加Chrome特定选项
	chromeCaps := chrome.Capabilities{
		Args: []string{
			"--headless", // 无头模式
			"--no-sandbox",
			"--disable-dev-shm-usage",
		},
	}
	caps.AddChrome(chromeCaps)
	
	// 添加Selenoid特定能力
	caps.Add("enableVNC", true)  // 启用VNC
	caps.Add("enableVideo", true) // 启用视频录制
	
	// 创建WebDriver客户端
	wd, err := selenium.NewRemote(caps, selenoidURL)
	if err != nil {
		log.Fatalf("Failed to open session: %v", err)
	}
	defer wd.Quit()
	
	// 导航到测试页面
	err = wd.Get("https://www.example.com")
	if err != nil {
		log.Fatalf("Failed to load page: %v", err)
	}
	
	// 获取页面标题
	title, err := wd.Title()
	if err != nil {
		log.Fatalf("Failed to get page title: %v", err)
	}
	fmt.Printf("Page title: %s\n", title)
	
	// 等待5秒以便观察
	time.Sleep(5 * time.Second)
}

4. 高级配置

4.1 并行测试

func runTest(wg *sync.WaitGroup, sessionName string) {
	defer wg.Done()
	
	caps := selenium.Capabilities{"browserName": "chrome"}
	chromeCaps := chrome.Capabilities{
		Args: []string{"--headless"},
	}
	caps.AddChrome(chromeCaps)
	caps.Add("name", sessionName)
	
	wd, err := selenium.NewRemote(caps, selenoidURL)
	if err != nil {
		log.Printf("[%s] Failed to start: %v", sessionName, err)
		return
	}
	defer wd.Quit()
	
	// 测试逻辑...
}

func main() {
	var wg sync.WaitGroup
	for i := 0; i < 3; i++ {
		wg.Add(1)
		go runTest(&wg, fmt.Sprintf("Test-%d", i))
	}
	wg.Wait()
}

4.2 使用自定义浏览器版本

caps := selenium.Capabilities{
	"browserName": "chrome",
	"version":     "90.0", // 指定浏览器版本
}

5. 监控和管理

Selenoid提供UI界面(http://localhost:8080)和API端点:

func checkSelenoidStatus() {
	resp, err := http.Get("http://localhost:8080/status")
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	
	body, _ := io.ReadAll(resp.Body)
	fmt.Println("Selenoid status:", string(body))
}

6. 最佳实践

  1. 总是使用defer wd.Quit()确保资源释放
  2. 为测试添加唯一名称以便识别
  3. 合理设置超时时间
  4. 考虑使用无头模式提高性能
  5. 定期清理旧的视频和日志

7. 总结

Selenoid为Golang测试提供了高效的Selenium Hub替代方案,结合Docker容器技术,可以实现快速、隔离的浏览器测试环境。通过上述代码示例,您可以轻松集成Selenoid到您的Golang测试框架中。

要了解更多高级功能,如视频录制、日志收集等,可以参考Selenoid官方文档:https://aerokube.com/selenoid/latest/

回到顶部