class Base_Page(Borg, unittest.TestCase): "Page class that all page models can inherit from" def __init__(self, base_url='http://qxf2.com/', trailing_slash_flag=True): "Constructor" Borg.__init__(self) if self.is_first_time(): #Do these actions if this the first time this class is initialized self.set_directory_structure() self.image_url_list = [] self.msg_list = [] self.current_console_log_errors = [] self.window_structure = {} self.testrail_flag = False self.browserstack_flag = False self.reset() #We assume relative URLs start without a / in the beginning if base_url[-1] != '/' and trailing_slash_flag is True: base_url += '/' self.base_url = base_url self.driver_obj = DriverFactory() if self.driver is not None: self.start() #Visit and initialize xpaths for the appropriate page def reset(self): "Reset the base page object" self.driver = None self.result_counter = 0 #Increment whenever success or failure are called self.pass_counter = 0 #Increment everytime success is called self.mini_check_counter = 0 #Increment when conditional_write is called self.mini_check_pass_counter = 0 #Increment when conditional_write is called with True self.failure_message_list = [] self.screenshot_counter = 1 def get_failure_message_list(self): "Return the failure message list" return self.failure_message_list def switch_page(self, page_name): "Switch the underlying class to the required Page" self.__class__ = PageFactory.PageFactory.get_page_object( page_name, base_url=self.base_url).__class__ def register_driver(self, browserstack_flag, os_name, os_version, browser, browser_version): "Register the driver with Page" self.driver = self.driver_obj.get_web_driver(browserstack_flag, os_name, os_version, browser, browser_version) self.set_screenshot_dir() # Create screenshot directory self.log_obj = Base_Logging(level=logging.DEBUG) self.log_obj.set_stream_handler_level(self.log_obj.getStreamHandler(), level=logging.DEBUG) self.driver.implicitly_wait(5) self.driver.maximize_window() if (browserstack_flag.lower() == 'y'): print "Before registering bs" self.register_browserstack() self.session_url = self.browserstack_obj.get_session_url() self.browserstack_msg = 'BrowserStack session URL:' self.write(self.browserstack_msg + '\n' + str(self.session_url)) self.start() def get_current_driver(self): "Return current driver" return self.driver def register_testrail(self): "Register TestRail with Page" self.testrail_flag = True self.tr_obj = Test_Rail() def register_browserstack(self): "Register Browser Stack with Page" self.browserstack_flag = True self.browserstack_obj = BrowserStack_Library() def get_calling_module(self): "Get the name of the calling module" calling_file = inspect.stack()[-1][1] if 'runpy' in calling_file: calling_file = inspect.stack()[5][1] calling_filename = calling_file.split(os.sep) #This logic bought to you by windows + cygwin + git bash if len(calling_filename) == 1: #Needed for calling_filename = calling_file.split('/') self.calling_module = calling_filename[-1].split('.')[0] return self.calling_module def set_directory_structure(self): "Setup the required directory structure if it is not already present" try: screenshots_parent_dir = os.path.abspath( os.path.join(os.path.dirname(__file__), '..', 'screenshots')) if not os.path.exists(screenshots_parent_dir): os.makedirs(screenshots_parent_dir) except Exception, e: self.write("Exception when trying to set directory structure") self.write(str(e))
class Mobile_Base_Page(Borg, unittest.TestCase): "Page class that all page models can inherit from" def __init__(self, base_url='https://tn-devel.appspot.com/tap', trailing_slash_flag=True): "Constructor" Borg.__init__(self) if self.is_first_time(): #Do these actions if this the first time this class is initialized self.screenshot_counter = 1 self.set_directory_structure() self.set_screenshot_dir() # Create screenshot directory self.image_url_list = [] self.msg_list = [] self.window_structure = {} self.testrail_flag = False self.browserstack_flag = False self.driver = None self.result_counter = 0 #Increment whenever success or failure are called self.pass_counter = 0 #Increment everytime success is called self.mini_check_counter = 0 #Increment when conditional_write is called self.mini_check_pass_counter = 0 #Increment when conditional_write is called with True self.failure_message_list = [] #We assume relative URLs start without a / in the beginning if base_url[-1] != '/' and trailing_slash_flag is True: base_url += '/' self.base_url = base_url self.driver_obj = DriverFactory() self.log_obj = Base_Logging(level=logging.DEBUG) self.log_obj.set_stream_handler_level(self.log_obj.getStreamHandler(), level=logging.DEBUG) if self.driver is not None: self.start() #Visit and initialize xpaths for the appropriate page def switch_page(self, page_name): "Switch the underlying class to the required Page" self.__class__ = PageFactory.PageFactory.get_page_object( page_name).__class__ def register_driver(self, sauce_flag, os_name, os_version, browser, browser_version): "Register the driver with Page" self.driver = self.driver_obj.get_web_driver(sauce_flag, os_name, os_version, browser, browser_version) self.driver.implicitly_wait(5) self.driver.maximize_window() self.start() def register_mobile_driver(self, mobile_os_name, mobile_os_version, device_name, app_package, app_activity, mobile_sauce_flag, device_flag): "Register the mobile driver" self.driver = self.driver_obj.run_mobile( mobile_os_name, mobile_os_version, device_name, app_package, app_activity, mobile_sauce_flag, device_flag) self.start() def get_current_driver(self): "Return current driver" return self.driver def get_console_log(self): "Return current browser's console logs from driver" return self.driver.get_log('browser') def get_driver_title(self): "Return the title of the current page" return self.driver.title def get_current_url(self): "Return the current url" return self.driver.current_url def register_testrail(self): "Register TestRail with Page" self.testrail_flag = True self.tr_obj = Test_Rail() self.write('Automation registered with TestRail', level='debug') def register_browserstack(self): "Register Browser Stack with Page" self.browserstack_flag = True self.browserstack_obj = BrowserStack_Library() def set_locator_conf(self, locator_path): "Set the path of the configuration file with locators" self.xpath_conf_file = locator_path def start(self): "Dummy method to be over-written by child classes" pass def _screenshot(func): "Decorator for taking screenshot" def wrapper(*args, **kwargs): result = func(*args, **kwargs) screenshot_name = '%003d' % args[ 0].screenshot_counter + '_' + func.__name__ args[0].screenshot_counter += 1 args[0].save_screenshot(screenshot_name) return result return wrapper def _exceptionHandler(f): "Decorator to handle exceptions" argspec = getargspec(f) def inner(*args, **kwargs): try: return f(*args, **kwargs) except Exception, e: args[0].write('You have this exception') args[0].write('Exception in method: %s' % str(f.__name__)) args[0].write('PYTHON SAYS: %s' % str(e)) return inner