Skip to content

Instantly share code, notes, and snippets.

@kvii
Last active October 13, 2023 00:19
Show Gist options
  • Save kvii/6637521004d70511bf2a94bdf6408a46 to your computer and use it in GitHub Desktop.
Save kvii/6637521004d70511bf2a94bdf6408a46 to your computer and use it in GitHub Desktop.
define custom state with rod
func NewTask(b *rod.Browser, user User) *Task {
page := b.Page("https://www.your_site.com/")
return &Task{page, user}
}
type Task struct {
page *rod.Page
user User
isLoggedIn atomic.Bool
}
func (t *Task) DoSomething(ctx context.Context) error {
page := t.page.Context(ctx)
if !t.isLoggedIn.Load() {
err := t.login(page) // <- login if not logged in
if err != nil {
return err
}
}
err := t.do(page)
if errors.Is(err, ErrNotLoggedIn) {
isLoggedIn.Store(false)
}
return err
}
func (t *Task) do(page *rod.page) error {
e, err := page.Element("button.only-for-logged-in-users")
if errors.Is(err, rod.ErrElementNotFound) {// <- not found if not logged in
return ErrNotLoggedIn
}
return e.Click()
}
func (t *Task) login(page *rod.page) error
// Don't forget to close the page
func (t *Task) Close() error {
return t.page.Close()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment