在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《如果元素不存在,带有 Golang 的 Chromedp 就会超出截止日期。有没有办法在截止日期后延长上下文超时?》就很适合你!本篇内容主要包括##content_title##,希望对大家的知识积累有所帮助,助力实战开发!
问题内容我有一个函数,使用 chromedp 检查是否有时会弹出确认模式。如果弹出该功能,则该功能可以工作,但如果上下文截止日期延长,它仍然会说已超出截止日期。奇怪的是,如果其他运行中的截止日期缩短了,它就会起作用。
func check(page string) {
opts := append(chromedp.DefaultExecAllocatorOptions[:],
chromedp.UserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36"),
chromedp.Flag("enable-automation", false),
chromedp.Flag("headless", false),
)
ctx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)
defer cancel()
ctx, cancel = chromedp.NewContext(ctx)
defer cancel()
ctx, cancel = context.WithTimeout(ctx, 10*time.Second)
defer cancel()
err := chromedp.Run(ctx,
chromedp.Navigate(page),
chromedp.WaitReady("body", chromedp.ByQuery),
chromedp.Click(`#ackBtn`, chromedp.ByID),
)
if err != nil {
fmt.Println("Didn't find Ack")
//return
}
ctx, cancel = context.WithTimeout(ctx, 30*time.Second)
defer cancel()
err2 := chromedp.Run(ctx,
chromedp.Click(`#options > div:nth-child(1) > div.c-card__column2 > a.c-card__btn.btn-new.btn-color-blue.btn-size-xxlarge.btn-width-auto.btn-max-width`, chromedp.ByID),
)
if err2 != nil {
fmt.Println("exited on error", err)
}
}
正确答案
ctx, cancel = context.withtimeout(ctx, 30*time.second)
请注意,该语句不会延长上下文的超时时间。从超时上下文创建的子上下文将立即超时。
请参阅下面的测试:
func testtimeoutcontext(t *testing.t) {
ctx, cancel := context.withtimeout(context.background(), time.millisecond)
defer cancel()
time.sleep(2 * time.millisecond)
err := ctx.err()
if err != context.deadlineexceeded {
t.errorf("got %v; want %v", err, context.deadlineexceeded)
}
ctx, cancel = context.withtimeout(ctx, time.hour)
defer cancel()
err = ctx.err()
if err != context.deadlineexceeded {
t.errorf("got %v; want %v", err, context.deadlineexceeded)
}
}
我想这就是你想要的:
func check(page string) {
opts := append(chromedp.DefaultExecAllocatorOptions[:],
chromedp.UserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36"),
chromedp.Flag("enable-automation", false),
chromedp.Flag("headless", false),
)
ctx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)
defer cancel()
pageCtx, cancel := chromedp.NewContext(ctx)
defer cancel()
// pageCtx is used to open the page
if err := chromedp.Run(pageCtx,
chromedp.Navigate(page),
); err != nil {
return
}
// ackCtx is created from pageCtx.
// when ackCtx exceeds the deadline, pageCtx is not affected.
ackCtx, cancel := context.WithTimeout(pageCtx, 10*time.Second)
defer cancel()
err := chromedp.Run(ackCtx,
chromedp.WaitReady("body", chromedp.ByQuery),
chromedp.Click(`#ackBtn`, chromedp.ByID),
)
if err != nil {
fmt.Println("Didn't find Ack")
//return
}
// create another context from pageCtx to make sure the action finished in
// 30 seconds. If you don't need this behavior, you can use pageCtx directly.
clickCtx, cancel := context.WithTimeout(pageCtx, 30*time.Second)
defer cancel()
err2 := chromedp.Run(clickCtx,
chromedp.Click(`#options > div:nth-child(1) > div.c-card__column2 > a.c-card__btn.btn-new.btn-color-blue.btn-size-xxlarge.btn-width-auto.btn-max-width`, chromedp.ByID),
)
if err2 != nil {
fmt.Println("exited on error", err)
}
}
context
的设计思想请参考https://go.dev/blog/context。
本篇关于《如果元素不存在,带有 Golang 的 Chromedp 就会超出截止日期。有没有办法在截止日期后延长上下文超时?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注编程网公众号!