0

如何在同一浏览器的新窗口中打开标签页?某些 Web 应用程序无法在非活动选项卡中运行。

在示例中,打开了几个窗口,但只有第一个窗口可用于管理。创建其余部分时,发生错误

chrome 无法启动:将在当前浏览器会话中打开一个窗口或选项卡。

package main

import (
    "context"
    "log"
    "time"

    "github.com/chromedp/chromedp"
)

func main() {
    userDir := "someUserDir"

    opts := append(chromedp.DefaultExecAllocatorOptions[:],
        chromedp.DisableGPU,
        chromedp.UserDataDir(userDir),
        chromedp.WindowSize(1368, 768),
        chromedp.Flag("headless", false),
        chromedp.Flag("enable-automation", false),
        chromedp.Flag("restore-on-startup", false),
        chromedp.Flag("new-window", true),
    )

    for i := 0; i < 5; i++ {
        log.Printf("open window %d", i)
        allocCtx, _ := chromedp.NewExecAllocator(context.Background(), opts...)
        ctx, _ := chromedp.NewContext(allocCtx)

        if err := chromedp.Run(ctx, chromedp.Navigate("https://example.com")); err != nil {
            log.Println(err)
        }
    }

    time.Sleep(time.Minute)
}
4

1 回答 1

0
package main

import (
    "context"
    "log"
    "time"

    "github.com/chromedp/cdproto/runtime"
    "github.com/chromedp/chromedp"
)

func main() {
    opts := append(chromedp.DefaultExecAllocatorOptions[:],
        chromedp.DisableGPU,
        chromedp.UserDataDir("someUserDir"),
        chromedp.Flag("headless", false),
        chromedp.Flag("enable-automation", false),
        chromedp.Flag("restore-on-startup", false),
    )
    allocCtx, _ := chromedp.NewExecAllocator(context.Background(), opts...)

    ctx, _ := chromedp.NewContext(allocCtx)
    if err := chromedp.Run(ctx, chromedp.Navigate("about:blank")); err != nil {
        log.Fatalln(err)
    }

    for i := 0; i < 5; i++ {
        var res *runtime.RemoteObject
        if err := chromedp.Run(ctx, chromedp.Evaluate(`window.open("about:blank", "", "resizable,scrollbars,status")`, &res)); err != nil {
            log.Fatalln(err)
        }
        targets, err := chromedp.Targets(ctx)
        if err != nil {
            log.Fatalln(err)
        }
        for _, t := range targets {
            if !t.Attached {
                newCtx, _ := chromedp.NewContext(ctx, chromedp.WithTargetID(t.TargetID))
                if err := chromedp.Run(newCtx, chromedp.Navigate("https://example.com")); err != nil {
                    log.Fatalln(err)
                }
            }
        }
    }

    time.Sleep(time.Minute)
}
于 2020-02-23T11:48:20.077 回答