github.com/web-platform-tests/wpt.fyi@v0.0.0-20240530210107-70cf978996f1/webdriver/search_test.go (about) 1 // +build large 2 3 package webdriver 4 5 import ( 6 "errors" 7 "fmt" 8 "testing" 9 10 "github.com/stretchr/testify/assert" 11 "github.com/tebeka/selenium" 12 ) 13 14 func TestSearch(t *testing.T) { 15 if *staging { 16 t.Skip("skipping search tests on staging (#1327)") 17 } 18 runWebdriverTest(t, func(t *testing.T, app AppServer, wd selenium.WebDriver) { 19 t.Run("wpt-results", func(t *testing.T) { 20 testSearch(t, wd, app, "/", "wpt-results") 21 }) 22 }) 23 } 24 25 func testSearch(t *testing.T, wd selenium.WebDriver, app AppServer, path, elementName string) { 26 folder := "2dcontext" 27 resultsLoadedCondition := func(wd selenium.WebDriver) (bool, error) { 28 pathParts, err := getPathPartElements(wd, elementName) 29 if err != nil { 30 return false, err 31 } 32 return len(pathParts) > 0, nil 33 } 34 35 // NOTE(lukebjerring): firefox can't take sendKeys for shadow elements. 36 // https://bugzilla.mozilla.org/show_bug.cgi?id=1503860 37 if *browser != "firefox" { 38 t.Run("search-input", func(t *testing.T) { 39 if err := wd.Get(app.GetWebappURL(path)); err != nil { 40 assert.FailNow(t, fmt.Sprintf("Error navigating to homepage: %s", err.Error())) 41 } 42 err := wd.WaitWithTimeout(resultsLoadedCondition, LongTimeout) 43 assert.Nil(t, err) 44 45 // Type the search. 46 searchBox, err := getSearchElement(wd) 47 if err != nil { 48 assert.FailNow(t, fmt.Sprintf("Error getting search element: %s", err.Error())) 49 } 50 if err := searchBox.SendKeys(folder + selenium.EnterKey); err != nil { 51 assert.FailNow(t, fmt.Sprintf("Error sending keys: %s", err.Error())) 52 } 53 assertListIsFiltered(t, wd, elementName, folder+"/") 54 }) 55 } 56 57 t.Run("search-param", func(t *testing.T) { 58 if err := wd.Get(app.GetWebappURL(path) + "?q=" + folder); err != nil { 59 assert.FailNow(t, fmt.Sprintf("Error navigating to homepage: %s", err.Error())) 60 } 61 62 err := wd.WaitWithTimeout(resultsLoadedCondition, LongTimeout) 63 assert.Nil(t, err) 64 assertListIsFiltered(t, wd, elementName, folder+"/") 65 }) 66 } 67 68 func assertListIsFiltered(t *testing.T, wd selenium.WebDriver, elementName string, paths ...string) { 69 var pathParts []selenium.WebElement 70 var err error 71 filteredPathPartsCondition := func(wd selenium.WebDriver) (bool, error) { 72 pathParts, err = getPathPartElements(wd, elementName) 73 if err != nil { 74 return false, err 75 } 76 return len(pathParts) == len(paths), nil 77 } 78 err = wd.WaitWithTimeout(filteredPathPartsCondition, LongTimeout) 79 if err != nil { 80 assert.Fail(t, fmt.Sprintf("Expected exactly %v results", len(paths))) 81 return 82 } 83 for i := range paths { 84 text, err := FindShadowText(wd, pathParts[i], "a") 85 if err != nil { 86 assert.Fail(t, err.Error()) 87 } 88 assert.Equal(t, paths[i], text) 89 } 90 } 91 92 func getSearchElement(wd selenium.WebDriver) (selenium.WebElement, error) { 93 e, err := wd.FindElement(selenium.ByCSSSelector, "wpt-app") 94 if err != nil { 95 return nil, err 96 } 97 inputs, err := FindShadowElements(wd, e, "test-search", "input.query") 98 if err != nil { 99 return nil, err 100 } else if len(inputs) < 1 { 101 return nil, errors.New("Failed to find any test-search input.query elements") 102 } 103 return inputs[0], err 104 }