gpt4 book ai didi

go - Chromedp 不在 ActionFunc 的循环内执行操作

转载 作者:数据小太阳 更新时间:2023-10-29 03:12:12 26 4
gpt4 key购买 nike

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

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 中的操作不会执行。

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

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

最佳答案

chromedp.ActionFunc 用于构建自定义操作。您提供的功能将在 Run 阶段执行。

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

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

您的代码应如下所示:

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
}),
}
}

免责声明:我没有测试过这段代码,因此可能存在问题,但这应该让您大致了解定义和执行操作,以及正确返回错误。

关于go - Chromedp 不在 ActionFunc 的循环内执行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48505809/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com