From 04906f5102799b2f505f7511a093618b69fc5956 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Mon, 13 May 2019 21:24:20 +0100 Subject: [PATCH] add examples for handling new tabs and dialogs These are common use cases for event listeners, so add simple examples. --- event_test.go | 3 +- example_test.go | 83 ++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 80 insertions(+), 6 deletions(-) diff --git a/event_test.go b/event_test.go index cf4741c1..3cc1e299 100644 --- a/event_test.go +++ b/event_test.go @@ -162,12 +162,11 @@ func TestClickNewTab(t *testing.T) { ctx, cancel := testAllocate(t, "newtab.html") defer cancel() - targetID := FromContext(ctx).Target.TargetID ch := make(chan target.ID, 1) ListenTarget(ctx, func(ev interface{}) { if ev, ok := ev.(*target.EventTargetCreated); ok && - ev.TargetInfo.OpenerID == targetID { + ev.TargetInfo.OpenerID != "" { ch <- ev.TargetInfo.TargetID } }) diff --git a/example_test.go b/example_test.go index 87f34c74..1ef73bf5 100644 --- a/example_test.go +++ b/example_test.go @@ -13,12 +13,15 @@ import ( "path/filepath" "strings" + "github.com/chromedp/cdproto/page" cdpruntime "github.com/chromedp/cdproto/runtime" + "github.com/chromedp/cdproto/target" "github.com/chromedp/chromedp" ) func writeHTML(content string) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/html") io.WriteString(w, strings.TrimSpace(content)) }) } @@ -28,14 +31,12 @@ func ExampleTitle() { defer cancel() ts := httptest.NewServer(writeHTML(` - fancy website title
- `)) defer ts.Close() @@ -125,7 +126,6 @@ func ExampleListenTarget_consoleLog() { defer cancel() ts := httptest.NewServer(writeHTML(` - - `)) defer ts.Close() @@ -159,3 +158,79 @@ func ExampleListenTarget_consoleLog() { // console.log call: // string - "hello js world" } + +func ExampleClickNewTab() { + ctx, cancel := chromedp.NewContext(context.Background()) + defer cancel() + + mux := http.NewServeMux() + mux.Handle("/first", writeHTML(` + + `)) + mux.Handle("/second", writeHTML(``)) + ts := httptest.NewServer(mux) + defer ts.Close() + + lctx, cancel := context.WithCancel(ctx) + ch := make(chan target.ID, 1) + chromedp.ListenTarget(lctx, func(ev interface{}) { + if ev, ok := ev.(*target.EventTargetCreated); ok && + // if OpenerID == "", this is the first tab. + ev.TargetInfo.OpenerID != "" { + ch <- ev.TargetInfo.TargetID + cancel() + } + }) + if err := chromedp.Run(ctx, + chromedp.Navigate(ts.URL+"/first"), + chromedp.Click("#newtab", chromedp.ByID), + ); err != nil { + panic(err) + } + newCtx, cancel := chromedp.NewContext(ctx, chromedp.WithTargetID(<-ch)) + defer cancel() + + var urlstr string + if err := chromedp.Run(newCtx, chromedp.Location(&urlstr)); err != nil { + panic(err) + } + fmt.Println("new tab's path:", strings.TrimPrefix(urlstr, ts.URL)) + + // Output: + // new tab's path: /second +} + +func ExampleAcceptAlert() { + ctx, cancel := chromedp.NewContext(context.Background()) + defer cancel() + + mux := http.NewServeMux() + mux.Handle("/second", writeHTML(``)) + ts := httptest.NewServer(writeHTML(` + + `)) + defer ts.Close() + + chromedp.ListenTarget(ctx, func(ev interface{}) { + if ev, ok := ev.(*page.EventJavascriptDialogOpening); ok { + fmt.Println("closing alert:", ev.Message) + go func() { + if err := chromedp.Run(ctx, + page.HandleJavaScriptDialog(true), + ); err != nil { + panic(err) + } + }() + } + }) + + if err := chromedp.Run(ctx, + chromedp.Navigate(ts.URL), + chromedp.Click("#alert", chromedp.ByID), + ); err != nil { + panic(err) + } + + // Output: + // closing alert: alert text +}