An open API service indexing awesome lists of open source software.

https://github.com/pog7x/ssfactory

Simple screenshot factory
https://github.com/pog7x/ssfactory

chromedriver concurency geckodriver go screenshot selenium webdriver

Last synced: 2 months ago
JSON representation

Simple screenshot factory

Awesome Lists containing this project

README

          

# ssfactory

[![Go Reference](https://pkg.go.dev/badge/github.com/pog7x/ssfactory.svg)](https://pkg.go.dev/github.com/pog7x/ssfactory)
[![Build Status](https://github.com/pog7x/ssfactory/actions/workflows/go.yml/badge.svg)](https://github.com/pog7x/ssfactory/actions/workflows/go.yml)
[![License: MIT](https://img.shields.io/github/license/pog7x/ssfactory)](https://github.com/pog7x/ssfactory/blob/master/LICENSE)

Concurrent screenshot capture library for Go, powered by Selenium WebDriver and a built-in worker pool.

## Features

- **Browser support** — Chrome (via ChromeDriver) and Firefox (via GeckoDriver)
- **Concurrency** — built-in worker pool for parallel screenshot jobs
- **Element targeting** — capture specific DOM elements by ID, XPath, CSS selector, tag name, etc.
- **Flexible output** — raw `[]byte` passed to your handler (save to disk, upload, encode — up to you)

## Prerequisites

| Dependency | Purpose |
|---|---|
| [ChromeDriver](https://chromedriver.chromium.org/) or [GeckoDriver](https://github.com/mozilla/geckodriver) | Browser automation driver |
| Chrome or Firefox | Target browser binary |

## Installation

```bash
go get github.com/pog7x/ssfactory
```

## Quick Start

```go
package main

import "github.com/pog7x/ssfactory"

func main() {
f, stop, err := ssfactory.NewFactory(ssfactory.InitFactory{
WebdriverPort: 9515,
UseBrowser: ssfactory.ChromeName,
ChromeBinaryPath: "/usr/bin/google-chrome",
ChromedriverPath: "/usr/local/bin/chromedriver",
ChromeArgs: []string{"--headless", "--no-sandbox", "--disable-dev-shm-usage"},
WorkersCount: 4,
})
if err != nil {
panic(err)
}
defer stop()

maximize := ""
f.MakeScreenshot(ssfactory.MakeScreenshotPayload{
URL: "https://example.com",
DOMElementBy: ssfactory.ByTagName,
DOMElementName: "body",
Scroll: true,
MaximizeWindow: &maximize,
BytesHandler: func(b []byte) error {
// save, upload, encode to PNG, etc.
return nil
},
})
}
```

### Firefox example

```go
f, stop, err := ssfactory.NewFactory(ssfactory.InitFactory{
WebdriverPort: 8080,
UseBrowser: ssfactory.FirefoxName,
FirefoxBinaryPath: "/usr/bin/firefox",
GeckodriverPath: "/usr/local/bin/geckodriver",
FirefoxArgs: []string{"--headless", "--width=1920"},
WorkersCount: 2,
})
```

## API

### Element selectors

| Constant | Selenium strategy |
|---|---|
| `ByID` | `id` |
| `ByXPATH` | `xpath` |
| `ByLinkText` | `link text` |
| `ByPartialLinkText` | `partial link text` |
| `ByName` | `name` |
| `ByTagName` | `tag name` |
| `ByClassName` | `class name` |
| `ByCSSSelector` | `css selector` |

### `MakeScreenshotPayload`

| Field | Type | Description |
|---|---|---|
| `URL` | `string` | Page URL to navigate to |
| `DOMElementBy` | `string` | Selector strategy (see table above) |
| `DOMElementName` | `string` | Selector value |
| `Scroll` | `bool` | Scroll element into view before capture |
| `MaximizeWindow` | `*string` | Maximize window handle (pass `nil` to skip) |
| `Timeout` | `time.Duration` | Wait timeout before capturing |
| `BytesHandler` | `func([]byte) error` | Callback receiving screenshot bytes |

## License

[MIT](LICENSE) — Copyright (c) 2022 pog7x