【问题标题】:Chromedp don´t perform actions inside a loop in ActionFuncChromedp 不在 ActionFunc 的循环内执行操作
【发布时间】:2018-07-08 10:00:34
【问题描述】:

我有一个包含术语列表的切片,我想在某个搜索引擎页面中搜索每个术语,所以我这样做:

func risk(slice []string) chromedp.Tasks {

    return chromedp.Tasks{
        chromedp.Navigate("https://testpage"),
        chromedp.WaitVisible("#query_box", chromedp.ByID),
        chromedp.ActionFunc(func(context.Context, cdp.Executor) error {
            for _, element := range slice[2:] {
                fmt.Println(element)
                chromedp.SendKeys("#query_box", element, chromedp.ByID)
                chromedp.Click("#searchButton", chromedp.ByID),
            }
            return nil
        }),
    }
} 

当在main 中调用它时

err = c.Run(ctxt, risk(items))
    if err != nil {
        log.Fatal(err)
    }

ActionFunc 之前一切正常。无论我可以在函数(截屏等)之前添加什么操作都没有问题。

但是,ActionFunc 内部的操作不会被执行。

原因是return nil吗?我想返回一组任务,就像我在循环外执行的操作一样,但我找不到如何在 ActionFunc 的循环内执行此操作,因为返回的总是最新的项目而不是完整的集合...返回nil 是让函数至少开始的唯一方法。

在一组chromedp.Tasks 中执行此类循环操作的正确方法是什么?

【问题讨论】:

  • ActionFunc 描述了一个动作,它不会运行它。您需要致电.Do(context, executor) 了解您的内部操作。您还应该检查Do 返回的错误并将其返回。您可以看到现有操作是如何从其他操作构建的。例如,Navigate 操作。
  • 谢谢,正如你所说,我实际上错过了Do。我添加了它们,现在操作运行良好。如果您愿意,请随时添加答案,我会接受。

标签: go web-scraping automation


【解决方案1】:

chromedp.ActionFunc 用于构建自定义操作。你给它的函数会在Run阶段执行。

这意味着您的函数需要实际运行您在内部使用的操作。这是通过在操作上调用.Do 方法并将context.Contextcdp.Executor 传递给它来完成的。

至于错误,函数应该返回运行时遇到的任何错误。在嵌入式操作上调用 .Do 时,检查错误并在非零时返回。

您的代码应如下所示:

func risk(slice []string) chromedp.Tasks {

    return chromedp.Tasks{
        // ... other actions ...
        chromedp.ActionFunc(func(c context.Context, e cdp.Executor) error {
            for _, element := range slice[2:] {
                fmt.Println(element)
                err := chromedp.SendKeys("#query_box", element, chromedp.ByID).Do(c, e)
                if err != nil {
                  return err
                }
                err = chromedp.Click("#searchButton", chromedp.ByID).Do(c, e)
                if err != nil {
                  return err
                }
            }
            return nil
        }),
    }
}

免责声明:我尚未测试此代码,因此可能存在问题,但这应该让您大致了解定义与执行操作并正确返回错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 2014-04-10
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多