Home | History | Annotate | Download | only in functional
      1 #!/usr/bin/env python
      2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 
      6 import time
      7 
      8 import pyauto_functional  # Must be imported before pyauto
      9 import pyauto
     10 import test_utils
     11 
     12 from webdriver_pages import settings
     13 from webdriver_pages.settings import Behaviors, ContentTypes
     14 from webdriver_pages.settings import RestoreOnStartupType
     15 
     16 
     17 class PrefsUITest(pyauto.PyUITest):
     18   """TestCase for Preferences UI."""
     19 
     20   INFOBAR_TYPE = 'rph_infobar'
     21 
     22   def setUp(self):
     23     pyauto.PyUITest.setUp(self)
     24     self._driver = self.NewWebDriver()
     25 
     26   def Debug(self):
     27     """Test method for experimentation.
     28 
     29     This method will not run automatically.
     30     """
     31     driver = self.NewWebDriver()
     32     page = settings.ContentSettingsPage.FromNavigation(driver)
     33     import pdb
     34     pdb.set_trace()
     35 
     36   def _GetGeolocationContentSettingsBehavior(self):
     37     """Get the Content Settings behavior for Geolocation.
     38 
     39     Returns:
     40       The exceptions behavior for the specified content type.
     41       The content type is the available content setting available.
     42     """
     43     behavior_key = self.GetPrefsInfo().Prefs(
     44         pyauto.kGeolocationDefaultContentSetting)
     45     behaviors_dict = {1: 'ALLOW', 2: 'BLOCK', 3: 'ASK'}
     46     self.assertTrue(
     47         behavior_key in behaviors_dict,
     48         msg=('Invalid default behavior key "%s" for "geolocation" content' %
     49              behavior_key))
     50     return behaviors_dict[behavior_key]
     51 
     52   def _VerifyContentExceptionUI(self, content_type, hostname_pattern, behavior,
     53                                 incognito=False):
     54     """Find hostname pattern and behavior within UI on content exceptions page.
     55 
     56     Args:
     57       content_type: The string content settings type to manage.
     58       hostname_pattern: The URL or pattern associated with the behavior.
     59       behavior: The exception to allow or block the hostname.
     60       incognito: Incognito list displayed on exceptions settings page.
     61                  Default to False.
     62     """
     63     page = settings.ManageExceptionsPage.FromNavigation(
     64         self._driver, content_type)
     65     self.assertTrue(page.GetExceptions(incognito).has_key(hostname_pattern),
     66                      msg=('No displayed host name matches pattern "%s"'
     67                           % hostname_pattern))
     68     self.assertEqual(behavior, page.GetExceptions(incognito)[hostname_pattern],
     69                      msg=('Displayed behavior "%s" does not match behavior "%s"'
     70                           % (page.GetExceptions(incognito)[hostname_pattern],
     71                              behavior)))
     72 
     73   def testLocationSettingOptionsUI(self):
     74     """Verify the location options setting UI.
     75 
     76     Set the options through the UI using webdriver and verify the settings in
     77     pyAuto.
     78     """
     79     page = settings.ContentSettingsPage.FromNavigation(self._driver)
     80     page.SetContentTypeOption(ContentTypes.GEOLOCATION, Behaviors.ALLOW)
     81     self.assertEqual(
     82         1, self.GetPrefsInfo().Prefs(pyauto.kGeolocationDefaultContentSetting))
     83     page.SetContentTypeOption(ContentTypes.GEOLOCATION, Behaviors.BLOCK)
     84     self.assertEqual(
     85         2, self.GetPrefsInfo().Prefs(pyauto.kGeolocationDefaultContentSetting))
     86     page.SetContentTypeOption(ContentTypes.GEOLOCATION, Behaviors.ASK)
     87     self.assertEqual(
     88         3, self.GetPrefsInfo().Prefs(pyauto.kGeolocationDefaultContentSetting))
     89 
     90   def testBehaviorValueCorrectlyDisplayed(self):
     91     """Verify the set behavior value is correctly displayed."""
     92     # Block all sites.
     93     self.SetPrefs(pyauto.kGeolocationDefaultContentSetting, 2)
     94     self.assertEqual(
     95         self._GetGeolocationContentSettingsBehavior(), Behaviors.BLOCK.upper(),
     96         msg='The behavior was incorrectly set.')
     97     # Allow all sites.
     98     self.SetPrefs(pyauto.kGeolocationDefaultContentSetting, 1)
     99     self.assertEqual(
    100         self._GetGeolocationContentSettingsBehavior(), Behaviors.ALLOW.upper(),
    101         msg='The behavior was incorrectly set.')
    102     # Ask for permission when site wants to track.
    103     self.SetPrefs(pyauto.kGeolocationDefaultContentSetting, 3)
    104     self.assertEqual(
    105         self._GetGeolocationContentSettingsBehavior(), Behaviors.ASK.upper(),
    106         msg='The behavior was incorrectly set.')
    107 
    108   def testExceptionsEntryCorrectlyDisplayed(self):
    109     """Verify the exceptions line entry is correctly displayed in the UI."""
    110     geo_exception = (
    111         {'http://maps.google.com:80,http://maps.google.com:80':
    112             {'geolocation': 2}})
    113     self.SetPrefs(pyauto.kContentSettingsPatternPairs, geo_exception)
    114     self._VerifyContentExceptionUI(
    115         ContentTypes.GEOLOCATION, 'http://maps.google.com:80',
    116         Behaviors.BLOCK)
    117     geo_exception = (
    118         {'http://maps.google.com:80,http://maps.google.com:80':
    119             {'geolocation': 1}})
    120     self.SetPrefs(pyauto.kContentSettingsPatternPairs, geo_exception)
    121     self._VerifyContentExceptionUI(
    122         ContentTypes.GEOLOCATION, 'http://maps.google.com:80',
    123         Behaviors.ALLOW)
    124     geo_exception = (
    125         {'http://maps.google.com:80,http://maps.google.com:80':
    126             {'geolocation': 3}})
    127     self.SetPrefs(pyauto.kContentSettingsPatternPairs, geo_exception)
    128     self._VerifyContentExceptionUI(
    129         ContentTypes.GEOLOCATION, 'http://maps.google.com:80', Behaviors.ASK)
    130 
    131   def testAddNewExceptionUI(self):
    132     """Verify new exception added for hostname pattern and behavior in UI."""
    133     content_type = ContentTypes.PLUGINS
    134     page = settings.ManageExceptionsPage.FromNavigation(
    135         self._driver, content_type)
    136 
    137     pattern, behavior = ('bing.com', Behaviors.BLOCK)
    138     page.AddNewException(pattern, behavior)
    139     self.assertEqual(page.GetExceptions()[pattern], Behaviors.BLOCK,
    140                      msg='The behavior "%s" was not added for pattern "%s"'
    141                      % (behavior, pattern))
    142 
    143   def testChangeExceptionBehaviorUI(self):
    144     """Verify behavior for hostname pattern is changed in the UI."""
    145     content_type = ContentTypes.PLUGINS
    146     page = settings.ManageExceptionsPage.FromNavigation(
    147         self._driver, content_type)
    148 
    149     pattern, behavior = ('bing.com', Behaviors.BLOCK)
    150     page.AddNewException(pattern, behavior)
    151     new_behavior = Behaviors.ALLOW
    152     page.SetBehaviorForPattern(pattern, new_behavior)
    153     self.assertEqual(page.GetExceptions()[pattern], Behaviors.ALLOW,
    154                      msg='The behavior for "%s" did not change: "%s"'
    155                      % (pattern, behavior))
    156 
    157   def testDeleteExceptionUI(self):
    158     """Verify exception deleted for hostname pattern and behavior in the UI."""
    159     content_type = ContentTypes.PLUGINS
    160     page = settings.ManageExceptionsPage.FromNavigation(
    161         self._driver, content_type)
    162 
    163     pattern, behavior = ('bing.com', Behaviors.BLOCK)
    164     page.AddNewException(pattern, behavior)
    165     self.assertEqual(page.GetExceptions()[pattern], Behaviors.BLOCK,
    166                      msg='The behavior "%s" was not added for pattern "%s"'
    167                      % (behavior, pattern))
    168     page.DeleteException(pattern)
    169     self.assertEqual(page.GetExceptions().get(pattern, KeyError), KeyError,
    170                      msg='Pattern "%s" was not deleted' % pattern)
    171 
    172   def testNoInitialLineEntryInUI(self):
    173     """Verify no initial line entry is displayed in UI."""
    174     # Ask for permission when site wants to track.
    175     self.SetPrefs(pyauto.kGeolocationDefaultContentSetting, 3)
    176     self.assertEqual(
    177         3, self.GetPrefsInfo().Prefs(pyauto.kGeolocationDefaultContentSetting))
    178     page = settings.ManageExceptionsPage.FromNavigation(
    179         self._driver, ContentTypes.GEOLOCATION)
    180     self.assertEqual(0, len(page.GetExceptions()))
    181 
    182   def testCorrectCookiesSessionInUI(self):
    183     """Verify exceptions for cookies in UI list entry."""
    184     # Block cookies for for a session for google.com.
    185     self.SetPrefs(pyauto.kContentSettingsPatternPairs,
    186                   {'http://google.com:80': {'cookies': 2}})
    187     self._VerifyContentExceptionUI(
    188         ContentTypes.COOKIES, 'http://google.com:80', Behaviors.BLOCK)
    189 
    190   def testInitialLineEntryInIncognitoUI(self):
    191     """Verify initial line entry is displayed in Incognito UI."""
    192     self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW)  # Display incognito list.
    193     page = settings.ManageExceptionsPage.FromNavigation(
    194         self._driver, ContentTypes.PLUGINS)
    195     self.assertEqual(1, len(page.GetExceptions(incognito=True)))
    196 
    197   def testIncognitoExceptionsEntryCorrectlyDisplayed(self):
    198     """Verify exceptions entry is correctly displayed in the incognito UI."""
    199     self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW)  # Display incognito list.
    200     page = settings.ManageExceptionsPage.FromNavigation(
    201         self._driver, ContentTypes.PLUGINS)
    202     pattern, behavior = ('http://maps.google.com:80', Behaviors.BLOCK)
    203     page.AddNewException(pattern, behavior, incognito=True)
    204     self._VerifyContentExceptionUI(
    205         ContentTypes.PLUGINS, 'http://maps.google.com:80',
    206         Behaviors.BLOCK, incognito=True)
    207 
    208   def testSetPasswordAndDelete(self):
    209     """Verify a password can be deleted in the Content Settings UI."""
    210     password_list = []
    211     # Add two passwords, 1 for example0.com and 1 for example1.com.
    212     for i in range(2):
    213       # Construct a password dictionary with required fields.
    214       password = {
    215           'username_value': 'user%s (at] example.com'  % i,
    216           'password_value': 'test.password',
    217           'signon_realm': 'https://www.example%s.com/'  % i,
    218           'time': 1279650942.0,
    219           'origin_url': 'https://www.example%s.com/login'  % i,
    220           'username_element': 'username%s',
    221           'password_element': 'password',
    222           'submit_element': 'submit',
    223           'action_target': 'https://www.example%s.com/login/'  % i,
    224           'blacklist': False,
    225       }
    226 
    227       password_list.append(password)
    228       self.AddSavedPassword(password)
    229 
    230     saved_passwords = self.GetSavedPasswords()
    231     self.assertEquals(len(password_list), len(saved_passwords),
    232                       msg='Not all Passwords were saved.')
    233     for password in password_list:
    234       self.assertTrue(password in saved_passwords,
    235                       msg='Passwords were not saved correctly.')
    236 
    237     page = settings.PasswordsSettings.FromNavigation(self._driver)
    238     # Delete one of the passwords.
    239     password = password_list[1]
    240     page.DeleteItem(password['origin_url'], password['username_value'])
    241     self.assertTrue(password not in self.GetSavedPasswords(),
    242                     msg='Password was not deleted.')
    243 
    244   def testSetCookieAndDeleteInContentSettings(self):
    245     """Verify a cookie can be deleted in the Content Settings UI."""
    246     # Create a cookie.
    247     cookie_dict = {
    248         'name': 'test_cookie',
    249         'value': 'test_value',
    250         'expiry': time.time() + 30,
    251     }
    252     site = '127.0.0.1'
    253     self.NavigateToURL(self.GetHttpURLForDataPath('google', 'google.html'))
    254     self._driver.add_cookie(cookie_dict)
    255     page = settings.CookiesAndSiteDataSettings.FromNavigation(self._driver)
    256     page.DeleteSiteData(site)
    257     self.assertTrue(site not in page.GetSiteNameList(),
    258                     'Site "%s" was not deleted.'  % site)
    259 
    260   def testRemoveMailProtocolHandler(self):
    261     """Verify the mail protocol handler is added and removed successfully."""
    262     url = self.GetHttpURLForDataPath('settings', 'protocol_handler.html')
    263     self.NavigateToURL(url)
    264     # Returns a dictionary with the mail handler that was asked for
    265     # registration.
    266     asked_handler_dict = self._driver.execute_script(
    267         'return registerMailClient()')
    268     self.PerformActionOnInfobar(
    269         'accept', infobar_index=test_utils.WaitForInfobarTypeAndGetIndex(
    270             self, self.INFOBAR_TYPE))
    271     self._driver.find_element_by_id('test_mail_protocol').click()
    272 
    273     protocol_handlers_list = (
    274         self.GetPrefsInfo().Prefs(pyauto.kRegisteredProtocolHandlers))
    275     registered_mail_handler = {}
    276     for handler_dict in protocol_handlers_list:
    277       if (handler_dict['protocol'] == 'mailto' and
    278           handler_dict['url'] == asked_handler_dict['url'] and
    279           handler_dict['title'] == asked_handler_dict['title'] and
    280           handler_dict.get('default')):
    281         registered_mail_handler = handler_dict
    282         break
    283       # Verify the mail handler is registered as asked.
    284       self.assertNotEqual(
    285       registered_mail_handler, {},
    286       msg='Mail protocol handler was not registered correctly.')
    287       # Verify the registered mail handler works as expected.
    288       self.assertTrue(
    289           self._driver.execute_script(
    290               'return doesQueryConformsToProtocol("%s", "%s")'
    291               % (asked_handler_dict['query_key'],
    292                  asked_handler_dict['query_value'])),
    293               msg='Mail protocol did not register correctly.')
    294 
    295     self._driver.get('chrome://settings-frame/handlers')
    296     # There are 3 DIVs in a handler entry. The last one acts as a remove button.
    297     # The remove button is also equivalent to setting the site to NONE.
    298     self._driver.find_element_by_id('handlers-list').\
    299         find_element_by_xpath('.//div[@role="listitem"]').\
    300         find_element_by_xpath('.//div[@class="handlers-site-column"]').\
    301         find_element_by_xpath('.//option[@value="-1"]').click()
    302 
    303     self._driver.get(url)
    304     self._driver.find_element_by_id('test_mail_protocol').click()
    305     self.assertEqual(url, self._driver.current_url,
    306                      msg='Mail protocol still registered.')
    307 
    308 class BasicSettingsUITest(pyauto.PyUITest):
    309   """Testcases for uber page basic settings UI."""
    310 
    311   def setUp(self):
    312     pyauto.PyUITest.setUp(self)
    313     self._driver = self.NewWebDriver()
    314 
    315   def Debug(self):
    316     """chrome://plugins test debug method.
    317 
    318     This method will not run automatically.
    319     """
    320     driver = self.NewWebDriver()
    321     page = settings.BasicSettingsPage.FromNavigation(driver)
    322     import pdb
    323     pdb.set_trace()
    324 
    325   def testOnStartupSettings(self):
    326     """Verify user can set startup options."""
    327     page = settings.BasicSettingsPage.FromNavigation(self._driver)
    328     page.SetOnStartupOptions(RestoreOnStartupType.NEW_TAB_PAGE)
    329     self.assertEqual(RestoreOnStartupType.NEW_TAB_PAGE,
    330         self.GetPrefsInfo().Prefs(pyauto.kRestoreOnStartup))
    331     page.SetOnStartupOptions(RestoreOnStartupType.RESTORE_SESSION)
    332     self.assertEqual(RestoreOnStartupType.RESTORE_SESSION,
    333         self.GetPrefsInfo().Prefs(pyauto.kRestoreOnStartup))
    334     page.SetOnStartupOptions(RestoreOnStartupType.RESTORE_URLS)
    335     self.assertEqual(RestoreOnStartupType.RESTORE_URLS,
    336         self.GetPrefsInfo().Prefs(pyauto.kRestoreOnStartup))
    337 
    338   def testSetStartupPages(self):
    339     """Verify user can add urls for startup pages."""
    340     page = settings.BasicSettingsPage.FromNavigation(self._driver)
    341     for url in ['www.google.com', 'http://www.amazon.com', 'ebay.com']:
    342       page.AddStartupPage(url)
    343     self.assertEqual(RestoreOnStartupType.RESTORE_URLS,
    344         self.GetPrefsInfo().Prefs(pyauto.kRestoreOnStartup))
    345     startup_urls = self.GetPrefsInfo().Prefs(pyauto.kURLsToRestoreOnStartup)
    346     self.assertEqual(startup_urls[0], 'http://www.google.com/')
    347     self.assertEqual(startup_urls[1], 'http://www.amazon.com/')
    348     self.assertEqual(startup_urls[2], 'http://ebay.com/')
    349 
    350   def testUseCurrentPagesForStartup(self):
    351     """Verify user can start up browser using current pages."""
    352     page = settings.BasicSettingsPage.FromNavigation(self._driver)
    353     self.OpenNewBrowserWindow(True)
    354     url1 = self.GetHttpURLForDataPath('title2.html')
    355     url2 = self.GetHttpURLForDataPath('title3.html')
    356     self.NavigateToURL(url1, 1, 0)
    357     self.AppendTab(pyauto.GURL(url2), 1)
    358     title_list = ['Title Of Awesomeness',
    359                   'Title Of More Awesomeness']
    360     page.UseCurrentPageForStartup(title_list)
    361     page.VerifyStartupURLs(title_list)
    362     self.assertEqual(RestoreOnStartupType.RESTORE_URLS,
    363         self.GetPrefsInfo().Prefs(pyauto.kRestoreOnStartup))
    364     startup_urls = self.GetPrefsInfo().Prefs(pyauto.kURLsToRestoreOnStartup)
    365     self.assertEqual(len(startup_urls), 3)
    366     self.assertEqual(startup_urls[1], url1)
    367     self.assertEqual(startup_urls[2], url2)
    368 
    369   def testCancelStartupURLSetting(self):
    370     """Verify canceled start up URLs settings are not saved."""
    371     page = settings.BasicSettingsPage.FromNavigation(self._driver)
    372     for url in ['www.google.com', 'http://www.amazon.com']:
    373       page.CancelStartupURLSetting(url)
    374     startup_urls = self.GetPrefsInfo().Prefs(pyauto.kURLsToRestoreOnStartup)
    375     self.assertEqual(len(startup_urls), 0)
    376 
    377 
    378 if __name__ == '__main__':
    379   pyauto_functional.Main()
    380