go - 如何登录网页并截图

标签 go browser automation chromedp

如何使用 chromedp 登录网页并截图。

https://github.com/chromedp/chromedp

最佳答案

将文本发送到网站输入的示例

func main() {
    var err error

    // create context
    ctxt, cancel := context.WithCancel(context.Background())
    defer cancel()

    // create chrome instance
    c, err := chromedp.New(ctxt, chromedp.WithLog(log.Printf))
    if err != nil {
        log.Fatal(err)
    }

    // run task list
    var val1, val2, val3, val4 string
    err = c.Run(ctxt, sendkeys(&val1, &val2, &val3, &val4))
    if err != nil {
        log.Fatal(err)
    }

    // shutdown chrome
    err = c.Shutdown(ctxt)
    if err != nil {
        log.Fatal(err)
    }

    // wait for chrome to finish
    err = c.Wait()
    if err != nil {
        log.Fatal(err)
    }

    log.Printf("#input1 value: %s", val1)
    log.Printf("#textarea1 value: %s", val2)
    log.Printf("#input2 value: %s", val3)
    log.Printf("#select1 value: %s", val4)
}

func sendkeys(val1, val2, val3, val4 *string) chromedp.Tasks {
    return chromedp.Tasks{
        chromedp.Navigate("file:" + os.Getenv("GOPATH") + 
      "/src/github.com/chromedp/chromedp/testdata/visible.html"),
        chromedp.WaitVisible(`#input1`, chromedp.ByID),
        chromedp.WaitVisible(`#textarea1`, chromedp.ByID),
        chromedp.SendKeys(`#textarea1`,
      kb.End+"\b\b\n\naoeu\n\ntest1\n\nblah2\n\n\t\t\t\b\bother
      box!\t\ntest4", chromedp.ByID),
        chromedp.Value(`#input1`, val1, chromedp.ByID),
        chromedp.Value(`#textarea1`, val2, chromedp.ByID),
        chromedp.SetValue(`#input2`, "test3", chromedp.ByID),
        chromedp.Value(`#input2`, val3, chromedp.ByID),
        chromedp.SendKeys(`#select1`, kb.ArrowDown+kb.ArrowDown,
      chromedp.ByID),
        chromedp.Value(`#select1`, val4, chromedp.ByID),
        chromedp.Sleep(30 * time.Second),
    }
}

然后你可以点击登录按钮,另一个例子

// Command click is a chromedp example demonstrating how to use a selector to
// click on an element.
package main

import (
    "context"
    "log"
    "time"

    "github.com/chromedp/chromedp"
)

func main() {
    var err error

    // create context
    ctxt, cancel := context.WithCancel(context.Background())
    defer cancel()

    // create chrome instance
    c, err := chromedp.New(ctxt, chromedp.WithLog(log.Printf))
    if err != nil {
        log.Fatal(err)
    }

    // run task list
    err = c.Run(ctxt, click())
    if err != nil {
        log.Fatal(err)
    }

    // shutdown chrome
    err = c.Shutdown(ctxt)
    if err != nil {
        log.Fatal(err)
    }

    // wait for chrome to finish
    err = c.Wait()
    if err != nil {
        log.Fatal(err)
    }
}

func click() chromedp.Tasks {
    return chromedp.Tasks{
        chromedp.Navigate(`https://golang.org/pkg/time/`),
        chromedp.WaitVisible(`#footer`),
        chromedp.Click(`#pkg-overview`, chromedp.NodeVisible),
        chromedp.Sleep(150 * time.Second),
    }
}

截图

// Command screenshot is a chromedp example demonstrating how to take a
// screenshot of a specific element.
package main

import (
    "context"
    "io/ioutil"
    "log"
    "time"

    "github.com/chromedp/chromedp"
)

func main() {
    var err error

    // create context
    ctxt, cancel := context.WithCancel(context.Background())
    defer cancel()

    // create chrome instance
    c, err := chromedp.New(ctxt, chromedp.WithLog(log.Printf))
    if err != nil {
        log.Fatal(err)
    }

    // run task list
    var buf []byte
    err = c.Run(ctxt, screenshot(`https://brank.as/`, `#contact-form`, &buf))
    if err != nil {
        log.Fatal(err)
    }

    // shutdown chrome
    err = c.Shutdown(ctxt)
    if err != nil {
        log.Fatal(err)
    }

    // wait for chrome to finish
    err = c.Wait()
    if err != nil {
        log.Fatal(err)
    }

    err = ioutil.WriteFile("contact-form.png", buf, 0644)
    if err != nil {
        log.Fatal(err)
    }
}

func screenshot(urlstr, sel string, res *[]byte) chromedp.Tasks {
    return chromedp.Tasks{
        chromedp.Navigate(urlstr),
        chromedp.Sleep(2 * time.Second),
        chromedp.WaitVisible(sel, chromedp.ByID),
        chromedp.WaitNotVisible(`div.v-middle > div.la-ball-clip-rotate`, chromedp.ByQuery),
        chromedp.Screenshot(sel, res, chromedp.NodeVisible, chromedp.ByID),
    }
}

如果你想要更详细的答案你需要发布网站,希望对你有帮助

关于go - 如何登录网页并截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51922052/

相关文章:

android - 如何从android apk在浏览器中打开网页?

python - 如何告诉子进程回答 "y"到命令行问题?

windows - Windows 上的脚本 Trac 安装

go - Cadence 长时间运行的子工作流程

go - 我怎样才能生成依赖于它们的前辈的例程?

arrays - 比较数组 golang

error-handling - 在 go 中处理多个错误

asp.net - PageLoad 中的客户端计算机(浏览器)属性

r - 不断扫描 R 工作目录中的新文件

c# - 指定的转换无效。 C# 网页浏览器