普通文本  |  380行  |  16.12 KB

#!/usr/bin/env python
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import time

import pyauto_functional  # Must be imported before pyauto
import pyauto
import test_utils

from webdriver_pages import settings
from webdriver_pages.settings import Behaviors, ContentTypes
from webdriver_pages.settings import RestoreOnStartupType


class PrefsUITest(pyauto.PyUITest):
  """TestCase for Preferences UI."""

  INFOBAR_TYPE = 'rph_infobar'

  def setUp(self):
    pyauto.PyUITest.setUp(self)
    self._driver = self.NewWebDriver()

  def Debug(self):
    """Test method for experimentation.

    This method will not run automatically.
    """
    driver = self.NewWebDriver()
    page = settings.ContentSettingsPage.FromNavigation(driver)
    import pdb
    pdb.set_trace()

  def _GetGeolocationContentSettingsBehavior(self):
    """Get the Content Settings behavior for Geolocation.

    Returns:
      The exceptions behavior for the specified content type.
      The content type is the available content setting available.
    """
    behavior_key = self.GetPrefsInfo().Prefs(
        pyauto.kGeolocationDefaultContentSetting)
    behaviors_dict = {1: 'ALLOW', 2: 'BLOCK', 3: 'ASK'}
    self.assertTrue(
        behavior_key in behaviors_dict,
        msg=('Invalid default behavior key "%s" for "geolocation" content' %
             behavior_key))
    return behaviors_dict[behavior_key]

  def _VerifyContentExceptionUI(self, content_type, hostname_pattern, behavior,
                                incognito=False):
    """Find hostname pattern and behavior within UI on content exceptions page.

    Args:
      content_type: The string content settings type to manage.
      hostname_pattern: The URL or pattern associated with the behavior.
      behavior: The exception to allow or block the hostname.
      incognito: Incognito list displayed on exceptions settings page.
                 Default to False.
    """
    page = settings.ManageExceptionsPage.FromNavigation(
        self._driver, content_type)
    self.assertTrue(page.GetExceptions(incognito).has_key(hostname_pattern),
                     msg=('No displayed host name matches pattern "%s"'
                          % hostname_pattern))
    self.assertEqual(behavior, page.GetExceptions(incognito)[hostname_pattern],
                     msg=('Displayed behavior "%s" does not match behavior "%s"'
                          % (page.GetExceptions(incognito)[hostname_pattern],
                             behavior)))

  def testLocationSettingOptionsUI(self):
    """Verify the location options setting UI.

    Set the options through the UI using webdriver and verify the settings in
    pyAuto.
    """
    page = settings.ContentSettingsPage.FromNavigation(self._driver)
    page.SetContentTypeOption(ContentTypes.GEOLOCATION, Behaviors.ALLOW)
    self.assertEqual(
        1, self.GetPrefsInfo().Prefs(pyauto.kGeolocationDefaultContentSetting))
    page.SetContentTypeOption(ContentTypes.GEOLOCATION, Behaviors.BLOCK)
    self.assertEqual(
        2, self.GetPrefsInfo().Prefs(pyauto.kGeolocationDefaultContentSetting))
    page.SetContentTypeOption(ContentTypes.GEOLOCATION, Behaviors.ASK)
    self.assertEqual(
        3, self.GetPrefsInfo().Prefs(pyauto.kGeolocationDefaultContentSetting))

  def testBehaviorValueCorrectlyDisplayed(self):
    """Verify the set behavior value is correctly displayed."""
    # Block all sites.
    self.SetPrefs(pyauto.kGeolocationDefaultContentSetting, 2)
    self.assertEqual(
        self._GetGeolocationContentSettingsBehavior(), Behaviors.BLOCK.upper(),
        msg='The behavior was incorrectly set.')
    # Allow all sites.
    self.SetPrefs(pyauto.kGeolocationDefaultContentSetting, 1)
    self.assertEqual(
        self._GetGeolocationContentSettingsBehavior(), Behaviors.ALLOW.upper(),
        msg='The behavior was incorrectly set.')
    # Ask for permission when site wants to track.
    self.SetPrefs(pyauto.kGeolocationDefaultContentSetting, 3)
    self.assertEqual(
        self._GetGeolocationContentSettingsBehavior(), Behaviors.ASK.upper(),
        msg='The behavior was incorrectly set.')

  def testExceptionsEntryCorrectlyDisplayed(self):
    """Verify the exceptions line entry is correctly displayed in the UI."""
    geo_exception = (
        {'http://maps.google.com:80,http://maps.google.com:80':
            {'geolocation': 2}})
    self.SetPrefs(pyauto.kContentSettingsPatternPairs, geo_exception)
    self._VerifyContentExceptionUI(
        ContentTypes.GEOLOCATION, 'http://maps.google.com:80',
        Behaviors.BLOCK)
    geo_exception = (
        {'http://maps.google.com:80,http://maps.google.com:80':
            {'geolocation': 1}})
    self.SetPrefs(pyauto.kContentSettingsPatternPairs, geo_exception)
    self._VerifyContentExceptionUI(
        ContentTypes.GEOLOCATION, 'http://maps.google.com:80',
        Behaviors.ALLOW)
    geo_exception = (
        {'http://maps.google.com:80,http://maps.google.com:80':
            {'geolocation': 3}})
    self.SetPrefs(pyauto.kContentSettingsPatternPairs, geo_exception)
    self._VerifyContentExceptionUI(
        ContentTypes.GEOLOCATION, 'http://maps.google.com:80', Behaviors.ASK)

  def testAddNewExceptionUI(self):
    """Verify new exception added for hostname pattern and behavior in UI."""
    content_type = ContentTypes.PLUGINS
    page = settings.ManageExceptionsPage.FromNavigation(
        self._driver, content_type)

    pattern, behavior = ('bing.com', Behaviors.BLOCK)
    page.AddNewException(pattern, behavior)
    self.assertEqual(page.GetExceptions()[pattern], Behaviors.BLOCK,
                     msg='The behavior "%s" was not added for pattern "%s"'
                     % (behavior, pattern))

  def testChangeExceptionBehaviorUI(self):
    """Verify behavior for hostname pattern is changed in the UI."""
    content_type = ContentTypes.PLUGINS
    page = settings.ManageExceptionsPage.FromNavigation(
        self._driver, content_type)

    pattern, behavior = ('bing.com', Behaviors.BLOCK)
    page.AddNewException(pattern, behavior)
    new_behavior = Behaviors.ALLOW
    page.SetBehaviorForPattern(pattern, new_behavior)
    self.assertEqual(page.GetExceptions()[pattern], Behaviors.ALLOW,
                     msg='The behavior for "%s" did not change: "%s"'
                     % (pattern, behavior))

  def testDeleteExceptionUI(self):
    """Verify exception deleted for hostname pattern and behavior in the UI."""
    content_type = ContentTypes.PLUGINS
    page = settings.ManageExceptionsPage.FromNavigation(
        self._driver, content_type)

    pattern, behavior = ('bing.com', Behaviors.BLOCK)
    page.AddNewException(pattern, behavior)
    self.assertEqual(page.GetExceptions()[pattern], Behaviors.BLOCK,
                     msg='The behavior "%s" was not added for pattern "%s"'
                     % (behavior, pattern))
    page.DeleteException(pattern)
    self.assertEqual(page.GetExceptions().get(pattern, KeyError), KeyError,
                     msg='Pattern "%s" was not deleted' % pattern)

  def testNoInitialLineEntryInUI(self):
    """Verify no initial line entry is displayed in UI."""
    # Ask for permission when site wants to track.
    self.SetPrefs(pyauto.kGeolocationDefaultContentSetting, 3)
    self.assertEqual(
        3, self.GetPrefsInfo().Prefs(pyauto.kGeolocationDefaultContentSetting))
    page = settings.ManageExceptionsPage.FromNavigation(
        self._driver, ContentTypes.GEOLOCATION)
    self.assertEqual(0, len(page.GetExceptions()))

  def testCorrectCookiesSessionInUI(self):
    """Verify exceptions for cookies in UI list entry."""
    # Block cookies for for a session for google.com.
    self.SetPrefs(pyauto.kContentSettingsPatternPairs,
                  {'http://google.com:80': {'cookies': 2}})
    self._VerifyContentExceptionUI(
        ContentTypes.COOKIES, 'http://google.com:80', Behaviors.BLOCK)

  def testInitialLineEntryInIncognitoUI(self):
    """Verify initial line entry is displayed in Incognito UI."""
    self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW)  # Display incognito list.
    page = settings.ManageExceptionsPage.FromNavigation(
        self._driver, ContentTypes.PLUGINS)
    self.assertEqual(1, len(page.GetExceptions(incognito=True)))

  def testIncognitoExceptionsEntryCorrectlyDisplayed(self):
    """Verify exceptions entry is correctly displayed in the incognito UI."""
    self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW)  # Display incognito list.
    page = settings.ManageExceptionsPage.FromNavigation(
        self._driver, ContentTypes.PLUGINS)
    pattern, behavior = ('http://maps.google.com:80', Behaviors.BLOCK)
    page.AddNewException(pattern, behavior, incognito=True)
    self._VerifyContentExceptionUI(
        ContentTypes.PLUGINS, 'http://maps.google.com:80',
        Behaviors.BLOCK, incognito=True)

  def testSetPasswordAndDelete(self):
    """Verify a password can be deleted in the Content Settings UI."""
    password_list = []
    # Add two passwords, 1 for example0.com and 1 for example1.com.
    for i in range(2):
      # Construct a password dictionary with required fields.
      password = {
          'username_value': 'user%s@example.com'  % i,
          'password_value': 'test.password',
          'signon_realm': 'https://www.example%s.com/'  % i,
          'time': 1279650942.0,
          'origin_url': 'https://www.example%s.com/login'  % i,
          'username_element': 'username%s',
          'password_element': 'password',
          'submit_element': 'submit',
          'action_target': 'https://www.example%s.com/login/'  % i,
          'blacklist': False,
      }

      password_list.append(password)
      self.AddSavedPassword(password)

    saved_passwords = self.GetSavedPasswords()
    self.assertEquals(len(password_list), len(saved_passwords),
                      msg='Not all Passwords were saved.')
    for password in password_list:
      self.assertTrue(password in saved_passwords,
                      msg='Passwords were not saved correctly.')

    page = settings.PasswordsSettings.FromNavigation(self._driver)
    # Delete one of the passwords.
    password = password_list[1]
    page.DeleteItem(password['origin_url'], password['username_value'])
    self.assertTrue(password not in self.GetSavedPasswords(),
                    msg='Password was not deleted.')

  def testSetCookieAndDeleteInContentSettings(self):
    """Verify a cookie can be deleted in the Content Settings UI."""
    # Create a cookie.
    cookie_dict = {
        'name': 'test_cookie',
        'value': 'test_value',
        'expiry': time.time() + 30,
    }
    site = '127.0.0.1'
    self.NavigateToURL(self.GetHttpURLForDataPath('google', 'google.html'))
    self._driver.add_cookie(cookie_dict)
    page = settings.CookiesAndSiteDataSettings.FromNavigation(self._driver)
    page.DeleteSiteData(site)
    self.assertTrue(site not in page.GetSiteNameList(),
                    'Site "%s" was not deleted.'  % site)

  def testRemoveMailProtocolHandler(self):
    """Verify the mail protocol handler is added and removed successfully."""
    url = self.GetHttpURLForDataPath('settings', 'protocol_handler.html')
    self.NavigateToURL(url)
    # Returns a dictionary with the mail handler that was asked for
    # registration.
    asked_handler_dict = self._driver.execute_script(
        'return registerMailClient()')
    self.PerformActionOnInfobar(
        'accept', infobar_index=test_utils.WaitForInfobarTypeAndGetIndex(
            self, self.INFOBAR_TYPE))
    self._driver.find_element_by_id('test_mail_protocol').click()

    protocol_handlers_list = (
        self.GetPrefsInfo().Prefs(pyauto.kRegisteredProtocolHandlers))
    registered_mail_handler = {}
    for handler_dict in protocol_handlers_list:
      if (handler_dict['protocol'] == 'mailto' and
          handler_dict['url'] == asked_handler_dict['url'] and
          handler_dict['title'] == asked_handler_dict['title'] and
          handler_dict.get('default')):
        registered_mail_handler = handler_dict
        break
      # Verify the mail handler is registered as asked.
      self.assertNotEqual(
      registered_mail_handler, {},
      msg='Mail protocol handler was not registered correctly.')
      # Verify the registered mail handler works as expected.
      self.assertTrue(
          self._driver.execute_script(
              'return doesQueryConformsToProtocol("%s", "%s")'
              % (asked_handler_dict['query_key'],
                 asked_handler_dict['query_value'])),
              msg='Mail protocol did not register correctly.')

    self._driver.get('chrome://settings-frame/handlers')
    # There are 3 DIVs in a handler entry. The last one acts as a remove button.
    # The remove button is also equivalent to setting the site to NONE.
    self._driver.find_element_by_id('handlers-list').\
        find_element_by_xpath('.//div[@role="listitem"]').\
        find_element_by_xpath('.//div[@class="handlers-site-column"]').\
        find_element_by_xpath('.//option[@value="-1"]').click()

    self._driver.get(url)
    self._driver.find_element_by_id('test_mail_protocol').click()
    self.assertEqual(url, self._driver.current_url,
                     msg='Mail protocol still registered.')

class BasicSettingsUITest(pyauto.PyUITest):
  """Testcases for uber page basic settings UI."""

  def setUp(self):
    pyauto.PyUITest.setUp(self)
    self._driver = self.NewWebDriver()

  def Debug(self):
    """chrome://plugins test debug method.

    This method will not run automatically.
    """
    driver = self.NewWebDriver()
    page = settings.BasicSettingsPage.FromNavigation(driver)
    import pdb
    pdb.set_trace()

  def testOnStartupSettings(self):
    """Verify user can set startup options."""
    page = settings.BasicSettingsPage.FromNavigation(self._driver)
    page.SetOnStartupOptions(RestoreOnStartupType.NEW_TAB_PAGE)
    self.assertEqual(RestoreOnStartupType.NEW_TAB_PAGE,
        self.GetPrefsInfo().Prefs(pyauto.kRestoreOnStartup))
    page.SetOnStartupOptions(RestoreOnStartupType.RESTORE_SESSION)
    self.assertEqual(RestoreOnStartupType.RESTORE_SESSION,
        self.GetPrefsInfo().Prefs(pyauto.kRestoreOnStartup))
    page.SetOnStartupOptions(RestoreOnStartupType.RESTORE_URLS)
    self.assertEqual(RestoreOnStartupType.RESTORE_URLS,
        self.GetPrefsInfo().Prefs(pyauto.kRestoreOnStartup))

  def testSetStartupPages(self):
    """Verify user can add urls for startup pages."""
    page = settings.BasicSettingsPage.FromNavigation(self._driver)
    for url in ['www.google.com', 'http://www.amazon.com', 'ebay.com']:
      page.AddStartupPage(url)
    self.assertEqual(RestoreOnStartupType.RESTORE_URLS,
        self.GetPrefsInfo().Prefs(pyauto.kRestoreOnStartup))
    startup_urls = self.GetPrefsInfo().Prefs(pyauto.kURLsToRestoreOnStartup)
    self.assertEqual(startup_urls[0], 'http://www.google.com/')
    self.assertEqual(startup_urls[1], 'http://www.amazon.com/')
    self.assertEqual(startup_urls[2], 'http://ebay.com/')

  def testUseCurrentPagesForStartup(self):
    """Verify user can start up browser using current pages."""
    page = settings.BasicSettingsPage.FromNavigation(self._driver)
    self.OpenNewBrowserWindow(True)
    url1 = self.GetHttpURLForDataPath('title2.html')
    url2 = self.GetHttpURLForDataPath('title3.html')
    self.NavigateToURL(url1, 1, 0)
    self.AppendTab(pyauto.GURL(url2), 1)
    title_list = ['Title Of Awesomeness',
                  'Title Of More Awesomeness']
    page.UseCurrentPageForStartup(title_list)
    page.VerifyStartupURLs(title_list)
    self.assertEqual(RestoreOnStartupType.RESTORE_URLS,
        self.GetPrefsInfo().Prefs(pyauto.kRestoreOnStartup))
    startup_urls = self.GetPrefsInfo().Prefs(pyauto.kURLsToRestoreOnStartup)
    self.assertEqual(len(startup_urls), 3)
    self.assertEqual(startup_urls[1], url1)
    self.assertEqual(startup_urls[2], url2)

  def testCancelStartupURLSetting(self):
    """Verify canceled start up URLs settings are not saved."""
    page = settings.BasicSettingsPage.FromNavigation(self._driver)
    for url in ['www.google.com', 'http://www.amazon.com']:
      page.CancelStartupURLSetting(url)
    startup_urls = self.GetPrefsInfo().Prefs(pyauto.kURLsToRestoreOnStartup)
    self.assertEqual(len(startup_urls), 0)


if __name__ == '__main__':
  pyauto_functional.Main()