chromedp.ActionFunc 中的任务没有按预期工作

问题描述

这是我的代码

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 不返回错误。它返回 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)
    }
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...