Home | History | Annotate | Download | only in ap_configurators
      1 # Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import os
      6 import urlparse
      7 
      8 import ap_spec
      9 import netgear_single_band_configurator
     10 from netgear_single_band_configurator import *
     11 
     12 
     13 class Netgear2000APConfigurator(netgear_single_band_configurator.
     14                                 NetgearSingleBandAPConfigurator):
     15     """Derived class to control Netgear WNR2000v3 router."""
     16 
     17     def _alert_handler(self, alert):
     18         """Checks for any modal dialogs which popup to alert the user and
     19         either raises a RuntimeError or ignores the alert.
     20 
     21         @param alert: The modal dialog's contents.
     22         """
     23         text = alert.text
     24         if 'The WEP security can only be supported on one SSID' in text:
     25             alert.accept()
     26         elif 'WPA-PSK [TKIP] only operates at "Up to 54Mbps"' in text:
     27             raise RuntimeError('Security and mode do not match:', text)
     28         elif '40 Mhz and 20 Mhz coexistence' in text:
     29             alert.accept()
     30         elif 'Are you sure that you do not want any wireless security' in text:
     31             alert.accept()
     32         elif 'WPS requires SSID broadcasting in order to work' in text:
     33             alert.accept()
     34         elif 'WPS is going to become inaccessible' in text:
     35             alert.accept()
     36         else:
     37             super(Netgear2000APConfigurator, self)._alert_handler(alert)
     38 
     39 
     40     def logout_from_previous_netgear(self):
     41         """Some netgear routers dislike you being logged into another
     42            one of their kind. So make sure that you are not."""
     43         self.click_button_by_id('yes', alert_handler=self._alert_handler)
     44         self.navigate_to_page(1)
     45 
     46 
     47     def navigate_to_page(self, page_number):
     48         """Navigates to the given page.
     49 
     50         @param page_number: the page to navigate to.
     51         """
     52         try:
     53             self.get_url(urlparse.urljoin(self.admin_interface_url,
     54                          'adv_index.htm'), page_title='WNR2000v3')
     55             self.click_button_by_id('setup_bt')
     56             self.wait_for_object_by_id('wireless')
     57             self.click_button_by_id('wireless')
     58         except Exception as e:
     59             if os.path.basename(self.driver.current_url) != 'adv_index.htm':
     60                 raise RuntimeError('Invalid url %s' % self.driver.current_url)
     61             elif os.path.basename(
     62                  self.driver.current_url) == 'multi_login.html':
     63                 self.logout_from_previous_netgear()
     64         setframe = self.driver.find_element_by_xpath(
     65                    '//iframe[@name="formframe"]')
     66         settings = self.driver.switch_to_frame(setframe)
     67         self.wait_for_object_by_xpath('//input[@name="ssid"]')
     68 
     69 
     70     def get_supported_modes(self):
     71         return [{'band': ap_spec.BAND_2GHZ,
     72                  'modes': [ap_spec.MODE_G, ap_spec.MODE_N]}]
     73 
     74 
     75     def set_mode(self, mode):
     76         # The mode popup changes based on the security mode.  Set to no
     77         # security to get the right popup.
     78         self.add_item_to_command_list(self._set_security_disabled, (), 1, 799)
     79         self.add_item_to_command_list(self._set_mode, (mode, ), 1, 800)
     80 
     81 
     82     def _set_mode(self, mode):
     83         if mode == ap_spec.MODE_G:
     84             mode = 'Up to 54 Mbps'
     85         elif mode == ap_spec.MODE_N:
     86             mode = 'Up to 150 Mbps'
     87         else:
     88             raise RuntimeError('Unsupported mode passed.')
     89         xpath = '//select[@name="opmode"]'
     90         self.select_item_from_popup_by_xpath(mode, xpath)
     91 
     92 
     93     def set_visibility(self, visible=True):
     94         self.add_item_to_command_list(self._set_visibility, (visible,), 1, 900)
     95 
     96 
     97     def _set_visibility(self, visible=True):
     98         xpath = '//input[@name="ssid_bc" and @type="checkbox"]'
     99         check_box = self.wait_for_object_by_xpath(xpath)
    100         # These check boxes behave different from other APs.
    101         value = check_box.is_selected()
    102         if (visible and not value) or (not visible and value):
    103             check_box.click()
    104 
    105         self.set_check_box_selected_by_xpath(xpath, selected=visible,
    106                                              wait_for_xpath=None,
    107                                              alert_handler=self._alert_handler)
    108