Как открыть вкладку в новом окне того же браузера с помощью chromedp? - PullRequest
0 голосов
/ 23 февраля 2020

Как открыть вкладку в новом окне того же браузера? Некоторые веб-приложения не работают на неактивной вкладке.

В этом примере открывается несколько windows, но для управления доступно только первое окно. При создании остальных возникает ошибка

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)
}

1 Ответ

0 голосов
/ 23 февраля 2020
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)
}
...