GlobalSearchPom.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. using Microsoft.Playwright;
  2. namespace Tests.E2e.PageObjectModels;
  3. /// <summary>
  4. /// POM for the header-level global search component.
  5. ///
  6. /// Selectors anchor on stable test IDs:
  7. /// global-search-input — the textbox
  8. /// global-search-results — the dropdown container (visible when query is non-empty)
  9. /// global-search-no-results — empty-state inside the dropdown
  10. /// global-search-result-{kind}-{n} — one row per match
  11. /// global-search-result-match — secondary label inside a row, e.g. "via ip: 10.0.0.5"
  12. /// </summary>
  13. public class GlobalSearchPom(IPage page) {
  14. public ILocator Input => page.GetByTestId("global-search-input");
  15. public ILocator Results => page.GetByTestId("global-search-results");
  16. public ILocator NoResults => page.GetByTestId("global-search-no-results");
  17. public ILocator Result(string kind, string name) =>
  18. page.GetByTestId($"global-search-result-{kind.ToLowerInvariant()}-{Sanitize(name)}");
  19. public ILocator ResultMatchLabel(string kind, string name) =>
  20. Result(kind, name).GetByTestId("global-search-result-match");
  21. public async Task SearchAsync(string query) {
  22. await Input.FillAsync(query);
  23. await Assertions.Expect(Results).ToBeVisibleAsync();
  24. }
  25. public async Task ClearAsync() => await Input.FillAsync("");
  26. public async Task ClickResultAsync(string kind, string name) =>
  27. await Result(kind, name).ClickAsync();
  28. public async Task AssertResultExistsAsync(string kind, string name) =>
  29. await Assertions.Expect(Result(kind, name)).ToBeVisibleAsync();
  30. public async Task AssertResultDoesNotExistAsync(string kind, string name) =>
  31. await Assertions.Expect(Result(kind, name)).Not.ToBeVisibleAsync();
  32. private static string Sanitize(string value) =>
  33. value.Replace(" ", "-").ToLowerInvariant();
  34. }