chromedp.ActionFunc中分配的变量无法由SendKeys输入

问题描述

经过一些处理后,我想在chromedp.ActionFunc中为变量分配字符串。 请参考以下示例。
但是,chromedp.SendKeys之后的chromedp.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
        }),

解决方法

第一种方法目前不起作用

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.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"]`,})

相关问答

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