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



chromedp.ActionFunc中,经过一些处理后,我想将字符串分配给变量。请参阅以下示例
但是,chromedp.ActionFunc之后的chromedp.SendKeys无法将变量输入表单。
我用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.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),
})

相关内容

  • 没有找到相关文章

最新更新