go - 使用 Chromedp 单击按钮

标签 go dom web-scraping google-chrome-devtools chromedp

我正在尝试使用 Go 库 Chromedp 从网页中抓取一些数据。

我基本上需要点击一个按钮,例如 W3C 学校网站上的“点击我”按钮。我需要使用 input HTML 标记的 value HTML 属性来过滤该按钮(因为没有要定位的特定 ID,并且大多数 Chromedp 示例都使用选择器基于 ID 属性)。

下面的代码似乎在没有点击按钮的情况下永远卡在初始网页上。

  • 为什么下面的代码没有点击按钮?
  • Chromedp 是否使用某些“标准”xpath 过滤器或什么?我认为 Chromedp 中选择器的语法是你可以找到的某种标准语法,例如也适用于 Selenium,但我找不到了解这些选择器规则的方法。 在 Chromedp 选择器中构建过滤器的语法规则是什么?
  • 除了源代码或 Go 文档之外,是否还有其他 Chromedp 文档来源?
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, clickStuff())
    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("DONE")
}

func clickStuff() chromedp.Tasks {
    return chromedp.Tasks{
        chromedp.Navigate(`https://www.w3schools.com/TAGS/tryit.asp?filename=tryhtml5_input_type_button`),
        chromedp.Click(`input[@value='Click me']`, chromedp.NodeVisible),
        chromedp.Sleep(5 * time.Second),
    }
}

此外,在运行上面的这段代码时,我看到了各种各样的日志,但基本上我看到这段日志被一遍又一遍地打印出来,这似乎表明标签不存在,但它确实存在,我不知道如何确定选择器使用什么语法?

2019/03/23 17:43:01 <- {"id":25,"method":"DOM.performSearch","params":{"query":"input[@value='Click me']"}}
2019/03/23 17:43:01 -> {"id":25,"result":{"searchId":"1000014442.18","resultCount":0}}

最佳答案

您可以使用 BySearch 选择器选择 html 属性:

chromedp.Click(`//*[@value="Click me"]`, chromedp.BySearch)

关于go - 使用 Chromedp 单击按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55316689/

相关文章:

Go 包不在 $GOROOT 中

opengl - 由 glEnableVertexArrayAttrib 生成的段错误

python - 无论如何要抓取重定向的链接?

go - 为什么 go 模块在没有详细信息的情况下会在提取某些有效的正确提交时失败?

Godoc,为整个包创建 html

javascript - 为什么我不能分配给动态创建的 html 文档的正文?

JQuery .insertAfter 在此示例中不起作用 - 为什么?

javascript - 操作 innerHTML 删除子元素的事件处理程序?

python - 从下拉列表中抓取值

python - 如何迭代 HTML 数据中所有表的代码?