1

我想在经过一些处理后将字符串分配给chromedp.ActionFunc. 参考下面的例子。
但是,chromedp.SendKeyschromedp.ActionFunc无法将变量输入到表单之后。
我用 确认了上述内容chromedp.CaptureScreenshot

package main

import (
    "context"
    "fmt"
    "io/ioutil"
    "log"
    "time"

    "github.com/chromedp/chromedp"
)

func main() {
    ctx, cancel := chromedp.NewContext(
        context.Background(),
        chromedp.WithLogf(log.Printf),
    )
    defer cancel()

    ctx, cancel = context.WithTimeout(ctx, 15*time.Second)
    defer cancel()

    var value string
    var buf0 []byte
    var buf1 []byte
    err := chromedp.Run(ctx, chromedp.Tasks{
        chromedp.Navigate(`https://stackoverflow.com/users/login`),
        chromedp.WaitVisible(`//*[@id="submit-button"]`),
        chromedp.CaptureScreenshot(&buf0),
        chromedp.ActionFunc(func(c context.Context) error {
            value = "apple"
            return nil
        }),
        chromedp.SendKeys(`//*[@id="email"]`, value),
        chromedp.CaptureScreenshot(&buf1),
    })
    if err != nil {
        log.Fatal(err)
    }
    fmt.Print(value)
    ioutil.WriteFile("./capture0.png", buf0, 0644)
    ioutil.WriteFile("./capture1.png", buf1, 0644)
}

如果chromedp.SendKeys包含在chromedp.ActionFunc以下内容中,则成功。
这种方法没有问题。
但我想知道为什么上述方法不起作用。
如果你有一些知识chromedp,请告诉我。

        chromedp.ActionFunc(func(c context.Context) error {
            value = "apple"
            chromedp.SendKeys(`//*[@id="email"]`, value).Do(c)
            return nil
        }),
4

1 回答 1

0

第一种方法目前不起作用

chromedp.SendKeys(`//*[@id="email"]`, value)

被调用时,变量的value值为空,因此它有效地SendKeys使用空字符串创建动作。chromedp.SendKeys如果在调用行为之前初始化变量将是预期的,请参阅固定代码:

package main

import (
    "context"
    "fmt"
    "io/ioutil"
    "log"
    "time"

    "github.com/chromedp/chromedp"
)

func main() {
    ctx, cancel := chromedp.NewContext(
        context.Background(),
        chromedp.WithLogf(log.Printf),
    )
    defer cancel()

    ctx, cancel = context.WithTimeout(ctx, 15*time.Second)
    defer cancel()

    var value string = "apple"
    var buf0 []byte
    var buf1 []byte
    err := chromedp.Run(ctx, chromedp.Tasks{
        chromedp.Navigate(`https://stackoverflow.com/users/login`),
        chromedp.WaitVisible(`//*[@id="submit-button"]`),
        chromedp.CaptureScreenshot(&buf0),
        chromedp.SendKeys(`//*[@id="email"]`, value),
        chromedp.CaptureScreenshot(&buf1),
    })
    if err != nil {
        log.Fatal(err)
    }
    fmt.Print(value)
    ioutil.WriteFile("./capture0.png", buf0, 0644)
    ioutil.WriteFile("./capture1.png", buf1, 0644)
}

编辑:这也将按您的预期工作。

    err := chromedp.Run(ctx, chromedp.Tasks{
        chromedp.Navigate(`https://stackoverflow.com/users/login`),
        chromedp.WaitVisible(`//*[@id="submit-button"]`),
        chromedp.CaptureScreenshot(&buf0),
        chromedp.ActionFunc(func(c context.Context) error {
            value = "apple"
            return nil
        }),
    })
    if err != nil {
        log.Fatal(err)
    }

    err = chromedp.Run(ctx, chromedp.Tasks{
        chromedp.SendKeys(`//*[@id="email"]`, value),
        chromedp.CaptureScreenshot(&buf1),
    })
于 2020-08-17T12:15:05.160 回答