github.com/bazelbuild/rules_webtesting@v0.2.0/go/screenshotter/screenshotter_test.go (about) 1 // Copyright 2017 Google Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package screenshotter 16 17 import ( 18 "fmt" 19 "image/png" 20 "io/ioutil" 21 "log" 22 "net/http" 23 "os" 24 "path/filepath" 25 "testing" 26 27 "github.com/bazelbuild/rules_webtesting/go/bazel" 28 "github.com/bazelbuild/rules_webtesting/go/portpicker" 29 "github.com/bazelbuild/rules_webtesting/go/webtest" 30 "github.com/tebeka/selenium" 31 ) 32 33 var testpage = "" 34 35 func TestMain(m *testing.M) { 36 port, err := portpicker.PickUnusedPort() 37 if err != nil { 38 log.Fatal(err) 39 } 40 41 dir, err := bazel.Runfile("testdata/") 42 if err != nil { 43 log.Fatal(err) 44 } 45 46 go func() { 47 log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", port), http.FileServer(http.Dir(dir)))) 48 }() 49 50 testpage = fmt.Sprintf("http://localhost:%d/testpage.html", port) 51 52 os.Exit(m.Run()) 53 } 54 55 func TestOfElement(t *testing.T) { 56 driver, err := webtest.NewWebDriverSession(selenium.Capabilities{}) 57 if err != nil { 58 t.Fatal(err) 59 } 60 61 defer driver.Quit() 62 63 shotter, err := New(driver) 64 65 if err := driver.Get(testpage); err != nil { 66 t.Fatal(err) 67 } 68 69 el, err := driver.FindElement(selenium.ByTagName, "input") 70 if err != nil { 71 t.Fatal(err) 72 } 73 74 img, err := shotter.Of(el).TakeScreenshot() 75 76 if err != nil { 77 t.Fatal(err) 78 } 79 80 tmpDir, err := bazel.NewTmpDir("crop_test") 81 if err != nil { 82 t.Fatal(err) 83 } 84 85 outPath := filepath.Join(tmpDir, "of-element.png") 86 87 log.Printf("Output file: %q", outPath) 88 89 if err := ioutil.WriteFile(outPath, img, 0660); err != nil { 90 t.Fatal(err) 91 } 92 93 check, err := os.Open(outPath) 94 if err != nil { 95 t.Fatal(err) 96 } 97 defer check.Close() 98 99 config, err := png.DecodeConfig(check) 100 if err != nil { 101 t.Fatal(err) 102 } 103 104 if config.Width != 200 || config.Height != 200 { 105 t.Fatalf("got size == %d, %d, expected 200, 200", config.Width, config.Height) 106 } 107 } 108 109 func TestExcluding(t *testing.T) { 110 driver, err := webtest.NewWebDriverSession(selenium.Capabilities{}) 111 if err != nil { 112 t.Fatal(err) 113 } 114 115 defer driver.Quit() 116 117 shotter, err := New(driver) 118 119 if err := driver.Get(testpage); err != nil { 120 t.Fatal(err) 121 } 122 123 outer, err := driver.FindElement(selenium.ByID, "outer-div") 124 if err != nil { 125 t.Fatal(err) 126 } 127 128 ex1, err := driver.FindElement(selenium.ByID, "inner-div1") 129 if err != nil { 130 t.Fatal(err) 131 } 132 133 ex2, err := driver.FindElement(selenium.ByID, "b") 134 if err != nil { 135 t.Fatal(err) 136 } 137 138 img, err := shotter.Of(outer).Excluding(ex1).Excluding(ex2).TakeScreenshot() 139 140 if err != nil { 141 t.Fatal(err) 142 } 143 144 tmpDir, err := bazel.NewTmpDir("exclude-element") 145 if err != nil { 146 t.Fatal(err) 147 } 148 149 outPath := filepath.Join(tmpDir, "cropped.png") 150 151 log.Printf("Output file: %q", outPath) 152 153 if err := ioutil.WriteFile(outPath, img, 0660); err != nil { 154 t.Fatal(err) 155 } 156 }