我有一个包含术语列表的片段,我想在某个搜索引擎页面中搜索每个术语,所以我这样做:
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中执行这种循环操作的正确方法是什么?
发布于 2018-01-30 17:17:21
chromedp.ActionFunc用于构建自定义操作。您提供的函数将在Run阶段执行。
这意味着您的函数需要实际运行您在内部使用的操作。这是通过调用操作上的.Do方法并传递给它一个context.Context和cdp.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
}),
}
}免责声明:我还没有测试过这段代码,所以可能会出现问题,但是这会给您定义vs执行操作和正确返回错误的一般想法。
https://stackoverflow.com/questions/48505809
复制相似问题