登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-03-31 23:42:36 441浏览 收藏

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

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>