首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在chromedp.ActionFunc中分配的变量不能由SendKeys输入

在chromedp.ActionFunc中分配的变量不能由SendKeys输入
EN

Stack Overflow用户
提问于 2020-08-17 07:31:21
回答 1查看 713关注 0票数 1

我希望在某些进程之后,在chromedp.ActionFunc中将字符串赋值给变量。请参阅下面的示例。

但是,chromedp.SendKeyschromedp.ActionFunc之后不能将变量输入到表单中。

我用chromedp.CaptureScreenshot确认了上面的内容。

代码语言:javascript
复制
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有一些了解,请告诉我。

代码语言:javascript
复制
        chromedp.ActionFunc(func(c context.Context) error {
            value = "apple"
            chromedp.SendKeys(`//*[@id="email"]`, value).Do(c)
            return nil
        }),
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-17 12:15:05

第一种方法目前起不到作用

代码语言:javascript
复制
chromedp.SendKeys(`//*[@id="email"]`, value)

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

代码语言:javascript
复制
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)
}

编辑:这也将如您所期望的那样工作。

代码语言:javascript
复制
    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),
    })
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63446466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档