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  }