internal/screentest: add support for evaluating javascript

Added the eval keyword to allow for evaluating JS. Useful for
manipulating or hiding DOM elements prior to screenshot capture.

Change-Id: I508f3949c2eed7d55fc4e168781ab4c3e00edb5b
Reviewed-on: https://go-review.googlesource.com/c/website/+/373714
Run-TryBot: Jamal Carvalho <jamal@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Trust: Jamal Carvalho <jamalcarvalho@google.com>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
diff --git a/cmd/screentest/testdata/godev.txt b/cmd/screentest/testdata/godev.txt
index f92ab57..a19ea05 100644
--- a/cmd/screentest/testdata/godev.txt
+++ b/cmd/screentest/testdata/godev.txt
@@ -3,6 +3,8 @@
 
 test homepage
 pathname /
+# The data in _content/events.yaml is stale, hide this section from the screenshots.
+eval document.querySelector('.LearnGo').style.display = 'none';
 capture fullscreen
 capture fullscreen 540x1080
 
@@ -13,6 +15,8 @@
 
 test getting started
 pathname /learn/
+# The data in _content/events.yaml is stale, hide this section from the screenshots.
+eval document.querySelector('.Learn-meetups').style.display = 'none';
 capture fullscreen
 capture fullscreen 540x1080
 
diff --git a/internal/screentest/screentest.go b/internal/screentest/screentest.go
index 5b7c387..4b97b20 100644
--- a/internal/screentest/screentest.go
+++ b/internal/screentest/screentest.go
@@ -322,6 +322,8 @@
 			tasks = append(tasks, chromedp.Click(args))
 		case "WAIT":
 			tasks = append(tasks, chromedp.WaitReady(args))
+		case "EVAL":
+			tasks = append(tasks, chromedp.Evaluate(args, nil))
 		case "CAPTURE":
 			if originA == "" || originB == "" {
 				return nil, fmt.Errorf("missing compare for capture on line %d", lineNo)
diff --git a/internal/screentest/screentest_test.go b/internal/screentest/screentest_test.go
index 6791564..86a35d8 100644
--- a/internal/screentest/screentest_test.go
+++ b/internal/screentest/screentest_test.go
@@ -126,6 +126,21 @@
 					viewportWidth:  1536,
 					viewportHeight: 960,
 				},
+				{
+					name:           "eval",
+					urlA:           "https://pkg.go.dev/eval",
+					cacheA:         true,
+					urlB:           "http://localhost:8080/eval",
+					outImgA:        filepath.Join(cache, "readtests-txt", "eval.pkg-go-dev.png"),
+					outImgB:        filepath.Join(cache, "readtests-txt", "eval.localhost-8080.png"),
+					outDiff:        filepath.Join(cache, "readtests-txt", "eval.diff.png"),
+					screenshotType: viewportScreenshot,
+					viewportWidth:  1536,
+					viewportHeight: 960,
+					tasks: chromedp.Tasks{
+						chromedp.Evaluate("console.log('Hello, world!')", nil),
+					},
+				},
 			},
 			wantErr: false,
 		},
diff --git a/internal/screentest/testdata/readtests.txt b/internal/screentest/testdata/readtests.txt
index b5a28c2..082377a 100644
--- a/internal/screentest/testdata/readtests.txt
+++ b/internal/screentest/testdata/readtests.txt
@@ -27,3 +27,8 @@
 
 pathname /about
 capture
+
+test eval
+pathname /eval
+eval console.log('hello, world!')
+capture