文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如果元素不存在,带有 Golang 的 Chromedp 就会超出截止日期。有没有办法在截止日期后延长上下文超时?

2024-04-05 00:10

关注

在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的相关知识,请关注编程网公众号!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯