chromedp.ActionFunc 中的任务未按预期工作
Tasks inside chromedp.ActionFunc not working as expected
这是我的代码:
package main
import (
"context"
"log"
"fmt"
"github.com/chromedp/chromedp"
)
func main() {
queries := [3]string{"Object.keys(window);", "window.CSS", "window.Array"}
// create context
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
// run task list
var res []byte
err := chromedp.Run(ctx,
chromedp.Navigate(`https://www.google.com/`),
chromedp.ActionFunc(func(ctx context.Context) error {
for _, query := range queries {
err2 := chromedp.Evaluate(query, &res)
if err2 != nil {
fmt.Printf("error in ActionFunc: %s\n", err2)
}
fmt.Printf("Query %s outputs: %v\n", query, res)
}
return nil
}),
)
if err != nil {
log.Fatal(err)
}
}
我想做的是导航到 url
以评估并获取 queries
的大列表的值(我将数组减少到 3 个查询示例)。
然后它应该只输出这些查询的值。
但我得到的是每次迭代的这些错误:
error in ActionFunc: %!s(chromedp.ActionFunc=0x7f25a0)
Query Object.keys(window); outputs: []
error in ActionFunc: %!s(chromedp.ActionFunc=0x7f25a0)
Query window.CSS outputs: []
error in ActionFunc: %!s(chromedp.ActionFunc=0x7f25a0)
Query window.Array outputs: []
chromedp.Evaluate不会return错误。它 returns EvaluateAction。它具有接受上下文的 Do func。所以你可以试试这个;
queries := [3]string{"Object.keys(window);", "window.CSS", "window.Array"}
// create context
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
// run task list
var res []byte
err := chromedp.Run(ctx,
chromedp.Navigate(`https://www.google.com/`),
chromedp.WaitReady("body"),
//chromedp.Evaluate("Object.keys(window)", &res),
chromedp.ActionFunc(func(ctx context.Context) error {
for _, query := range queries {
chromedp.Evaluate(query, &res).Do(ctx)
fmt.Printf("Query %s outputs: %+v\n", query, string(res))
}
return nil
}),
)
if err != nil {
log.Fatal(err)
}
这是我的代码:
package main
import (
"context"
"log"
"fmt"
"github.com/chromedp/chromedp"
)
func main() {
queries := [3]string{"Object.keys(window);", "window.CSS", "window.Array"}
// create context
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
// run task list
var res []byte
err := chromedp.Run(ctx,
chromedp.Navigate(`https://www.google.com/`),
chromedp.ActionFunc(func(ctx context.Context) error {
for _, query := range queries {
err2 := chromedp.Evaluate(query, &res)
if err2 != nil {
fmt.Printf("error in ActionFunc: %s\n", err2)
}
fmt.Printf("Query %s outputs: %v\n", query, res)
}
return nil
}),
)
if err != nil {
log.Fatal(err)
}
}
我想做的是导航到 url
以评估并获取 queries
的大列表的值(我将数组减少到 3 个查询示例)。
然后它应该只输出这些查询的值。
但我得到的是每次迭代的这些错误:
error in ActionFunc: %!s(chromedp.ActionFunc=0x7f25a0)
Query Object.keys(window); outputs: []
error in ActionFunc: %!s(chromedp.ActionFunc=0x7f25a0)
Query window.CSS outputs: []
error in ActionFunc: %!s(chromedp.ActionFunc=0x7f25a0)
Query window.Array outputs: []
chromedp.Evaluate不会return错误。它 returns EvaluateAction。它具有接受上下文的 Do func。所以你可以试试这个;
queries := [3]string{"Object.keys(window);", "window.CSS", "window.Array"}
// create context
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
// run task list
var res []byte
err := chromedp.Run(ctx,
chromedp.Navigate(`https://www.google.com/`),
chromedp.WaitReady("body"),
//chromedp.Evaluate("Object.keys(window)", &res),
chromedp.ActionFunc(func(ctx context.Context) error {
for _, query := range queries {
chromedp.Evaluate(query, &res).Do(ctx)
fmt.Printf("Query %s outputs: %+v\n", query, string(res))
}
return nil
}),
)
if err != nil {
log.Fatal(err)
}