diff --git a/main.go b/browser.go similarity index 74% rename from main.go rename to browser.go index 02e3dc4..65832c7 100644 --- a/main.go +++ b/browser.go @@ -2,6 +2,7 @@ package lwb import ( "net/http" + "net/http/cookiejar" "strings" "sync" @@ -9,25 +10,32 @@ import ( "golang.org/x/net/html" ) -type ( - Browser struct { - url string - userAgent string - document *html.Node - mut sync.RWMutex +type Browser struct { + url string + userAgent string + http *http.Client + document *html.Node + cookies *cookiejar.Jar + mut sync.RWMutex +} + +func NewBrowser(userAgent string) (*Browser, error) { + cj, err := cookiejar.New(nil) + if err != nil { + return nil, err } - Element struct { - node *html.Node + hc := &http.Client{ + Jar: cj, } -) -func NewBrowser(userAgent string) *Browser { b := &Browser{ userAgent: userAgent, + cookies: cj, + http: hc, } - return b + return b, nil } func (b *Browser) Get(url string) error { @@ -36,13 +44,14 @@ func (b *Browser) Get(url string) error { b.url = url - rest, err := http.Get(url) + resp, err := b.http.Get(url) if err != nil { return err } - defer rest.Body.Close() + defer resp.Body.Close() - b.document, err = html.Parse(rest.Body) + // Parse the HTML document + b.document, err = html.Parse(resp.Body) if err != nil { return err } diff --git a/element.go b/element.go new file mode 100644 index 0000000..9515152 --- /dev/null +++ b/element.go @@ -0,0 +1,32 @@ +package lwb + +import ( + "errors" + "strings" + + "golang.org/x/net/html" +) + +type Element struct { + node *html.Node + browser *Browser +} + +var ErrorNotClickable = errors.New("element is not clickable") + +func (self *Element) Click() error { + for e := self.node; e != nil; e = e.Parent { + if e.Type != html.ElementNode { + continue + } + if strings.ToLower(e.Data) == "a" { + for _, a := range e.Attr { + if a.Key == "href" { + return self.browser.Get(a.Val) + } + } + } + } + + return ErrorNotClickable +}