# Copyright (c) 2013 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 os import urlparse import ap_spec import netgear_single_band_configurator from netgear_single_band_configurator import * class Netgear2000APConfigurator(netgear_single_band_configurator. NetgearSingleBandAPConfigurator): """Derived class to control Netgear WNR2000v3 router.""" def _alert_handler(self, alert): """Checks for any modal dialogs which popup to alert the user and either raises a RuntimeError or ignores the alert. @param alert: The modal dialog's contents. """ text = alert.text if 'The WEP security can only be supported on one SSID' in text: alert.accept() elif 'WPA-PSK [TKIP] only operates at "Up to 54Mbps"' in text: raise RuntimeError('Security and mode do not match:', text) elif '40 Mhz and 20 Mhz coexistence' in text: alert.accept() elif 'Are you sure that you do not want any wireless security' in text: alert.accept() elif 'WPS requires SSID broadcasting in order to work' in text: alert.accept() elif 'WPS is going to become inaccessible' in text: alert.accept() else: super(Netgear2000APConfigurator, self)._alert_handler(alert) def logout_from_previous_netgear(self): """Some netgear routers dislike you being logged into another one of their kind. So make sure that you are not.""" self.click_button_by_id('yes', alert_handler=self._alert_handler) self.navigate_to_page(1) def navigate_to_page(self, page_number): """Navigates to the given page. @param page_number: the page to navigate to. """ try: self.get_url(urlparse.urljoin(self.admin_interface_url, 'adv_index.htm'), page_title='WNR2000v3') self.click_button_by_id('setup_bt') self.wait_for_object_by_id('wireless') self.click_button_by_id('wireless') except Exception as e: if os.path.basename(self.driver.current_url) != 'adv_index.htm': raise RuntimeError('Invalid url %s' % self.driver.current_url) elif os.path.basename( self.driver.current_url) == 'multi_login.html': self.logout_from_previous_netgear() setframe = self.driver.find_element_by_xpath( '//iframe[@name="formframe"]') settings = self.driver.switch_to_frame(setframe) self.wait_for_object_by_xpath('//input[@name="ssid"]') def get_supported_modes(self): return [{'band': ap_spec.BAND_2GHZ, 'modes': [ap_spec.MODE_G, ap_spec.MODE_N]}] def set_mode(self, mode): # The mode popup changes based on the security mode. Set to no # security to get the right popup. self.add_item_to_command_list(self._set_security_disabled, (), 1, 799) self.add_item_to_command_list(self._set_mode, (mode, ), 1, 800) def _set_mode(self, mode): if mode == ap_spec.MODE_G: mode = 'Up to 54 Mbps' elif mode == ap_spec.MODE_N: mode = 'Up to 150 Mbps' else: raise RuntimeError('Unsupported mode passed.') xpath = '//select[@name="opmode"]' self.select_item_from_popup_by_xpath(mode, xpath) def set_visibility(self, visible=True): self.add_item_to_command_list(self._set_visibility, (visible,), 1, 900) def _set_visibility(self, visible=True): xpath = '//input[@name="ssid_bc" and @type="checkbox"]' check_box = self.wait_for_object_by_xpath(xpath) # These check boxes behave different from other APs. value = check_box.is_selected() if (visible and not value) or (not visible and value): check_box.click() self.set_check_box_selected_by_xpath(xpath, selected=visible, wait_for_xpath=None, alert_handler=self._alert_handler)