问题描述
经过一些处理后,我想在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"]`,})