| # Copyright 2023 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| import json |
| import subprocess |
| from page_sets.desktop_ui.multitab_story import MultiTabStory |
| from page_sets.desktop_ui.ui_devtools_utils import ClickOn, InputText, \ |
| PressKey, SHIFT_DOWN |
| from page_sets.companion.browser_element_identifiers import \ |
| kToolbarSidePanelButtonElementId, kSidePanelComboboxElementId |
| from page_sets.companion.histograms import _CQ, _PROMO_EVENT, _SEARCH_BOX, \ |
| _STARTUP, _ZERO_STATE |
| from page_sets.login_helpers import google_login |
| from page_sets.data.companion_test_sites import SITES |
| |
| SCREENSHOT_PATH = "/tmp/" |
| |
| _GOOGLE_URL = "https://www.google.com/" |
| _TEST_SEARCH_URL = "https://www.google.com/search?q=test" |
| _TEST_PAGE_URL = "https://www.westelm.com" |
| _BLANK_URL = "about:blank" |
| _COMPANION_URL = "https://lens.google.com/companion?pli=1" |
| |
| |
| class CompanionStory(MultiTabStory): |
| """Base class for companion stories""" |
| URL_LIST = [_TEST_SEARCH_URL] |
| URL = URL_LIST[0] |
| WAIT_FOR_NETWORK_QUIESCENCE = True |
| |
| def RunPageInteractions(self, action_runner): |
| action_runner.tab.Navigate(_BLANK_URL) |
| action_runner.Wait(1) |
| assert action_runner.tab.url == _BLANK_URL |
| self.InteractWithPage(action_runner) |
| |
| def ToggleSidePanel(self, action_runner): |
| ClickOn(self._devtools, element_id=kToolbarSidePanelButtonElementId) |
| action_runner.Wait(3) |
| |
| def OpenCompanion(self, action_runner): |
| self.ToggleSidePanel(action_runner) |
| combobox_node_id = self._devtools.QueryNodes("id:%s" % |
| kSidePanelComboboxElementId)[0] |
| PressKey(self._devtools, combobox_node_id, " ") |
| action_runner.Wait(1) |
| window_node_id = self._devtools.QueryNodes("<Window>")[0] |
| PressKey(self._devtools, window_node_id, "ArrowUp") |
| PressKey(self._devtools, window_node_id, "Return") |
| |
| def LogIn(self, action_runner): |
| google_login.NewLoginGoogleAccount(action_runner, "intelligence") |
| |
| def SanityHistogramCheck(self, action_runner): |
| action_runner.tab.Navigate(_GOOGLE_URL) |
| action_runner.Wait(1) |
| assert action_runner.tab.url == _GOOGLE_URL, "%s" % action_runner.tab.url |
| histogram = self.FetchHistogram(action_runner, _STARTUP) |
| assert histogram["count"] == 1 |
| |
| def ConductHistogramCheck(self, |
| action_runner, |
| histogram_name, |
| expected_empty=False, |
| expected_count=None): |
| histogram = self.FetchHistogram(action_runner, histogram_name) |
| if expected_empty: |
| assert not histogram, "expected non-existent %s histogram, got %s" % \ |
| (histogram_name, histogram) |
| else: |
| assert histogram, "%s histogram is non-existent" % histogram_name |
| |
| if expected_count: |
| assert histogram['count'] == expected_count, \ |
| "Expected %s, got %s for histogram %s" % (expected_count, |
| histogram['count'], |
| histogram_name) |
| |
| def FetchHistogram(self, action_runner, name): |
| js = "statsCollectionController.getBrowserHistogram('%s');" % name |
| return json.loads(action_runner.EvaluateJavaScript(js)) |
| |
| def InteractWithPage(self, action_runner): |
| pass |
| |
| |
| class CompanionStoryBasicOpen(CompanionStory): |
| NAME = 'companion:basic_open_logged_in' |
| |
| def InteractWithPage(self, action_runner): |
| self.SanityHistogramCheck(action_runner) |
| self.LogIn(action_runner) |
| action_runner.Wait(1) |
| action_runner.tab.Navigate(_TEST_PAGE_URL) |
| action_runner.Wait(3) |
| |
| # Open companion and ensure features loaded. |
| self.OpenCompanion(action_runner) |
| action_runner.Wait(10) |
| self.ConductHistogramCheck(action_runner, _ZERO_STATE) |
| self.ConductHistogramCheck(action_runner, _CQ) |
| |
| |
| class CompanionStoryBasicOpenLoggedOut(CompanionStory): |
| NAME = 'companion:basic_open_logged_out' |
| |
| def InteractWithPage(self, action_runner): |
| self.SanityHistogramCheck(action_runner) |
| action_runner.tab.Navigate(_TEST_PAGE_URL) |
| action_runner.Wait(3) |
| |
| # Open companion and ensure features loaded. |
| self.OpenCompanion(action_runner) |
| action_runner.Wait(10) |
| self.ConductHistogramCheck(action_runner, _ZERO_STATE) |
| self.ConductHistogramCheck(action_runner, _PROMO_EVENT) |
| self.ConductHistogramCheck(action_runner, _CQ, expected_empty=True) |
| |
| |
| class CompanionStorySRP(CompanionStory): |
| NAME = 'companion:srp' |
| |
| def ConductSideSearch(self, action_runner): |
| action_runner.Wait(2) |
| node_id = self._devtools.QueryNodes('<Window>')[0] |
| action_runner.Wait(2) |
| PressKey(self._devtools, node_id, 'Tab', SHIFT_DOWN) |
| PressKey(self._devtools, node_id, 'Tab', SHIFT_DOWN) |
| PressKey(self._devtools, node_id, 'Tab', SHIFT_DOWN) |
| InputText(self._devtools, node_id, 'test input') |
| action_runner.Wait(1) |
| PressKey(self._devtools, node_id, 'Tab', SHIFT_DOWN) |
| PressKey(self._devtools, node_id, ' ') |
| PressKey(self._devtools, node_id, ' ') |
| action_runner.PressKey(' ') |
| action_runner.PressKey(' ') |
| |
| def InteractWithPage(self, action_runner): |
| self.SanityHistogramCheck(action_runner) |
| self.LogIn(action_runner) |
| action_runner.Wait(1) |
| action_runner.tab.Navigate(_TEST_PAGE_URL) |
| action_runner.Wait(3) |
| |
| # Open companion and ensure features loaded. |
| self.OpenCompanion(action_runner) |
| action_runner.Wait(10) |
| self.ConductHistogramCheck(action_runner, _ZERO_STATE) |
| self.ConductHistogramCheck(action_runner, _PROMO_EVENT) |
| self.ConductHistogramCheck(action_runner, _CQ) |
| |
| # Conduct Side Search |
| self.ConductHistogramCheck(action_runner, _SEARCH_BOX, expected_empty=True) |
| self.ConductSideSearch(action_runner) |
| self.ConductHistogramCheck(action_runner, _SEARCH_BOX) |
| |
| |
| class CompanionStoryScreenshot(CompanionStory): |
| NAME = 'companion:screenshot' |
| |
| def InteractWithPage(self, action_runner): |
| self.SanityHistogramCheck(action_runner) |
| self.LogIn(action_runner) |
| action_runner.Wait(5) |
| self.OpenCompanion(action_runner) |
| |
| for count, site in enumerate(SITES): |
| action_runner.tab.Navigate(site) |
| action_runner.Wait(15) |
| subprocess.call(["scrot", SCREENSHOT_PATH + str(count) + ".png"]) |