单击Chromedp按钮

问题描述 投票:0回答:1

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

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

以下代码似乎永远挂在初始网页上而不点击按钮。

  • 为什么下面的代码没有点击按钮?
  • Chromedp是使用一些“标准”xpath过滤器还是什么?我认为Chromedp中选择器的语法是某种标准语法,例如你可以找到对于Selenium来说,但我找不到了解这些选择器规则的方法。在Chromedp选择器中构建滤波器的语法规则是什么?
  • 是否有任何其他Chromedp文档来源不是源代码或Go文档?
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}}
go dom web-scraping google-chrome-devtools
1个回答
0
投票

我不知道你的特定语言范例,但按钮在iframe中。通常必须切换到iframe才能访问元素,或者在css中你可以使用深度组合器。

对于给出的页面,这将是

*/deep/[value="Click me"]

快速谷歌显示css选择器查​​询可以通过BySearch应用

© www.soinside.com 2019 - 2024. All rights reserved.