def __init__(self, webdriver=None, max_time=WTF_TIMEOUT_MANAGER.EPIC, sleep=5, **kwargs): """ Constructor Kwargs: webdriver (WebDriver) - Selenium Webdriver instance max_time (number) - Maximum wait time to keep the browser on stand by. sleep (number) - Number of seconds to wait between sending heart beats. """ if webdriver is None: webdriver = WTF_WEBDRIVER_MANAGER.get_driver() self.webdriver = webdriver self._sleep_time = sleep self._max_time = max_time # This is used by the shortcut method 'start_standby', which is used # with the 'with' statement. self._autostart = False try: if kwargs['_autostart']: self._autostart = True except KeyError: pass
def create_page(cls, webdriver=None, **kwargs): """ Class method short cut to call PageFactory on itself. @param webdriver: WebDriver to associate with this page. @type webdriver: WebDriver """ if not webdriver: webdriver = WTF_WEBDRIVER_MANAGER.get_driver() return PageFactory.create_page(cls, webdriver=webdriver, **kwargs)
def wait_until_page_loaded(page_obj_class, webdriver=None, timeout=WTF_TIMEOUT_MANAGER.NORMAL, sleep=0.5, bad_page_classes=[], **kwargs): """ Waits until the page is loaded. Usage Example: webdriver.get("http://www.mysite.com/login") # Wait up to 60 seconds for the page to load. login_page = wait_until_page_loaded(LoginPage, timeout=60) @return: Returns PageObject of type passed in. @rtype: PageObject """ if not webdriver: webdriver = WTF_WEBDRIVER_MANAGER.get_driver() #convert this param to list if not already. if type(bad_page_classes) != list: bad_page_classes = [bad_page_classes] end_time = datetime.now() + timedelta(seconds=timeout) last_exception = None while datetime.now() < end_time: # Check to see if we're at our target page. try: page = PageFactory.create_page(page_obj_class, webdriver=webdriver, **kwargs) PageUtils.wait_until_page_ready(page) return page except Exception as e: last_exception = e pass # Check to see if we're at one of those labled 'Bad' pages. for bad_page_class in bad_page_classes: try: PageFactory.create_page(bad_page_class, webdriver=webdriver, **kwargs) #if the if/else statement succeeds, than we have an error. raise BadPageEncounteredError("Encountered a bad page. " + bad_page_class.__name__) except BadPageEncounteredError as e: raise e except: pass #We didn't hit a bad page class yet. #sleep till the next iteration. time.sleep(sleep) print "Unable to construct page, last exception", last_exception raise PageLoadTimeoutError("Timedout while waiting for {page} to load. Url:{url}". \ format(page=PageUtils.__get_name_for_class__(page_obj_class), url=webdriver.current_url))
def __init__(self, webdriver=None, max_time=WTF_TIMEOUT_MANAGER.EPIC, sleep=5): """ Constructor Kwargs: webdriver (WebDriver) - Selenium Webdriver instance max_time (number) - Maximum wait time to keep the browser on stand by. sleep (number) - Number of seconds to wait between sending heart beats. """ if webdriver is None: webdriver = WTF_WEBDRIVER_MANAGER.get_driver() self.webdriver = webdriver self._sleep_time = sleep self._max_time = max_time
def create_page(cls, webdriver=None, **kwargs): """Class method short cut to call PageFactory on itself. Use it to instantiate this PageObject using a webdriver. Args: webdriver (Webdriver): Instance of Selenium Webdriver. Returns: PageObject Raises: InvalidPageError """ if not webdriver: webdriver = WTF_WEBDRIVER_MANAGER.get_driver() return PageFactory.create_page(cls, webdriver=webdriver, **kwargs)
def create_page(cls, webdriver=None, **kwargs): """Class method short cut to call PageFactory on itself. Use it to instantiate this PageObject using a webdriver. Args: webdriver (Webdriver): Instance of Selenium Webdriver. Returns: PageObject Raises: InvalidPageError """ if not webdriver: webdriver = WTF_WEBDRIVER_MANAGER.get_driver() return PageFactory.create_page(cls, webdriver=webdriver, **kwargs)
def test_view_demo(self): webdriver = WTF_WEBDRIVER_MANAGER.get_driver() webdriver.get(self.index_url) index_page = PageFactory.create_page(IndexPage) self.assertTrue(index_page.view_demo())
def test_search_in_navigation_bar(self): webdriver = WTF_WEBDRIVER_MANAGER.get_driver() webdriver.get(self.index_url) index_page = PageFactory.create_page(IndexPage) self.assertTrue(index_page.search_in_navigation_bar())
def create_page(page_object_class_or_interface, \ webdriver=None, **kwargs): """ Instantiate a page object from a given Interface or Abstract class. Instantiating a Page from PageObject from class usage: my_page_instance = PageFactory.create_page(MyPageClass) Instantiating a Page from an Interface or base class import pages.mysite.* my_page_instance = PageFactory.create_page(MyPageInterfaceClass) Instantiating a Page from a list of classes. my_page_instance = PageFactory.create_page([PossiblePage1, PossiblePage2]) Note: It'll only be able to detect pages that are imported. To it's best to do an import of all pages implementing a base class or the interface inside the __init__.py of the package directory. @param page_object_class_or_interface: Class, AbstractBaseClass, or Interface to attempt to consturct. @param webdriver: Selenium Webdriver to use to instantiate the page. @type webdriver: WebDriver """ if not webdriver: webdriver = WTF_WEBDRIVER_MANAGER.get_driver() # will be used later when tracking best matched page. current_matched_page = None # Walk through all classes of this sub class if type(page_object_class_or_interface) == list: subclasses = [] for page_class in page_object_class_or_interface: #attempt to instantiate class. page = PageFactory.__instantiate_page_object(page_class, \ webdriver, \ **kwargs) if isinstance(page, PageObject) and (current_matched_page == None or page > current_matched_page): current_matched_page = page #check for subclasses subclasses += PageFactory.__itersubclasses(page_class) else: # Try the original class page_class = page_object_class_or_interface page = PageFactory.__instantiate_page_object(page_class, webdriver, **kwargs) if isinstance(page, PageObject): current_matched_page = page #check for subclasses subclasses = PageFactory.__itersubclasses(page_object_class_or_interface) # Iterate over subclasses of the passed in classes to see if we have a better match. for pageClass in subclasses: try: page = pageClass(webdriver, **kwargs) if current_matched_page == None or page > current_matched_page: current_matched_page = page except InvalidPageError as e: print_debug("InvalidPageError", e) pass #This happens when the page fails check. except TypeError as e: print_debug("TypeError", e) pass #this happens when it tries to instantiate the original abstract class. except Exception as e: print_debug("Exception", e) #Unexpected exception. raise e # If no matching classes. if not isinstance(current_matched_page, PageObject): raise NoMatchingPageError("There's, no matching classes to this page. URL:%s" \ % webdriver.current_url) else: return current_matched_page
def create_page(page_object_class_or_interface, webdriver=None, **kwargs): """ Instantiate a page object from a given Interface or Abstract class. Args: page_object_class_or_interface (Class): PageObject class, AbstractBaseClass, or Interface to attempt to consturct. Kwargs: webdriver (WebDriver): Selenium Webdriver to use to instantiate the page. If none is provided, then it was use the default from WTF_WEBDRIVER_MANAGER Returns: PageObject Raises: NoMatchingPageError Instantiating a Page from PageObject from class usage:: my_page_instance = PageFactory.create_page(MyPageClass) Instantiating a Page from an Interface or base class:: import pages.mysite.* # Make sure you import classes first, or else PageFactory will not know about it. my_page_instance = PageFactory.create_page(MyPageInterfaceClass) Instantiating a Page from a list of classes.:: my_page_instance = PageFactory.create_page([PossiblePage1, PossiblePage2]) Note: It'll only be able to detect pages that are imported. To it's best to do an import of all pages implementing a base class or the interface inside the __init__.py of the package directory. """ if not webdriver: webdriver = WTF_WEBDRIVER_MANAGER.get_driver() # will be used later when tracking best matched page. current_matched_page = None # used to track if there is a valid page object within the set of PageObjects searched. was_validate_called = False # Walk through all classes if a list was passed. if type(page_object_class_or_interface) == list: subclasses = [] for page_class in page_object_class_or_interface: # attempt to instantiate class. page = PageFactory.__instantiate_page_object(page_class, webdriver, **kwargs) if isinstance(page, PageObject): was_validate_called = True if (current_matched_page == None or page > current_matched_page): current_matched_page = page elif page is True: was_validate_called = True # check for subclasses subclasses += PageFactory.__itersubclasses(page_class) else: # A single class was passed in, try to instantiate the class. page_class = page_object_class_or_interface page = PageFactory.__instantiate_page_object(page_class, webdriver, **kwargs) # Check if we got a valid PageObject back. if isinstance(page, PageObject): was_validate_called = True current_matched_page = page elif page is True: was_validate_called = True # check for subclasses subclasses = PageFactory.__itersubclasses( page_object_class_or_interface) # Iterate over subclasses of the passed in classes to see if we have a # better match. for pageClass in subclasses: try: page = PageFactory.__instantiate_page_object(pageClass, webdriver, **kwargs) # If we get a valid PageObject match, check to see if the ranking is higher # than our current PageObject. if isinstance(page, PageObject): was_validate_called = True if current_matched_page == None or page > current_matched_page: current_matched_page = page elif page is True: was_validate_called = True except InvalidPageError as e: _wtflog.debug("InvalidPageError: %s", e) pass # This happens when the page fails check. except TypeError as e: _wtflog.debug("TypeError: %s", e) # this happens when it tries to instantiate the original # abstract class. pass except Exception as e: _wtflog.debug("Exception during page instantiation: %s", e) # Unexpected exception. raise e # If no matching classes. if not isinstance(current_matched_page, PageObject): # Check that there is at least 1 valid page object that was passed in. if was_validate_called is False: raise TypeError("Neither the PageObjects nor it's subclasses have implemented " + "'PageObject._validate(self, webdriver)'.") try: current_url = webdriver.current_url raise NoMatchingPageError(u("There's, no matching classes to this page. URL:{0}") .format(current_url)) except: raise NoMatchingPageError(u("There's, no matching classes to this page. ")) else: return current_matched_page
def wait_until_page_loaded(page_obj_class, webdriver=None, timeout=WTF_TIMEOUT_MANAGER.NORMAL, sleep=0.5, bad_page_classes=[], message=None, **kwargs): """ Waits until the page is loaded. Args: page_obj_class (Class) : PageObject class Kwargs: webdriver (Webdriver) : Selenium Webdriver. Default uses WTF_WEBDRIVER_MANAGER's instance. timeout (number) : Number of seconds to wait to allow the page to load. sleep (number) : Number of seconds to wait between polling. bad_page_classes (list) : List of PageObject classes to fail if matched. For example, ServerError page. message (string) : Use your own message with PageLoadTimeoutError raised. Returns: PageObject Raises: PageUtilOperationTimeoutError : Timeout occurred before the desired PageObject was matched. BadPageEncounteredError : One or more of the PageObject in the specified 'bad_page_classes' list was matched. Usage Example:: webdriver.get("http://www.mysite.com/login") # Wait up to 60 seconds for the page to load. login_page = wait_until_page_loaded(LoginPage, timeout=60, [ServerErrorPage]) This will wait for the login_page to load, then return a LoginPage() PageObject. """ if not webdriver: webdriver = WTF_WEBDRIVER_MANAGER.get_driver() # convert this param to list if not already. if type(bad_page_classes) != list: bad_page_classes = [bad_page_classes] end_time = datetime.now() + timedelta(seconds=timeout) last_exception = None while datetime.now() < end_time: # Check to see if we're at our target page. try: page = PageFactory.create_page(page_obj_class, webdriver=webdriver, **kwargs) return page except Exception as e: _wtflog.debug("Encountered exception: %s ", e) last_exception = e # Check to see if we're at one of those labled 'Bad' pages. for bad_page_class in bad_page_classes: try: PageFactory.create_page(bad_page_class, webdriver=webdriver, **kwargs) # if the if/else statement succeeds, than we have an error. raise BadPageEncounteredError( u("Encountered a bad page. ") + bad_page_class.__name__) except BadPageEncounteredError as e: raise e except: pass # We didn't hit a bad page class yet. # sleep till the next iteration. time.sleep(sleep) print "Unable to construct page, last exception", last_exception # Attempt to get current URL to assist in debugging try: current_url = webdriver.current_url except: # unable to get current URL, could be a webdriver for a non-webpage like mobile app. current_url = None if message: err_msg = u(message) + u("{page}:{url}")\ .format(page=PageUtils.__get_name_for_class__(page_obj_class), url=current_url) else: err_msg = u("Timed out while waiting for {page} to load. Url:{url}")\ .format(page=PageUtils.__get_name_for_class__(page_obj_class), url=current_url) raise PageLoadTimeoutError(err_msg)
def test_preview_vimeo_video_before_posting(self): webdriver = WTF_WEBDRIVER_MANAGER.get_driver() webdriver.get(self.emshare_url) emshare_page = PageFactory.create_page(EmSharePage) self.assertTrue(emshare_page.preview_vimeo_video_before_posting())
def test_delete_tryon_item_from_current(self): webdriver = WTF_WEBDRIVER_MANAGER.get_driver() webdriver.get(self.tryon_url) tryon_page = PageFactory.create_page(TryonPage) self.assertTrue(tryon_page.delete_tryon_item_from_current())
def test_switch_back_to_face_from_hand(self): webdriver = WTF_WEBDRIVER_MANAGER.get_driver() webdriver.get(self.tryon_url) tryon_page = PageFactory.create_page(TryonPage) self.assertTrue(tryon_page.switch_back_to_face_from_hand())
def test_move_item_to_bottom_from_dropdown(self): webdriver = WTF_WEBDRIVER_MANAGER.get_driver() webdriver.get(self.tryon_url) tryon_page = PageFactory.create_page(TryonPage) self.assertTrue(tryon_page.move_item_to_bottom_from_dropdown())
def test_save_shirt_positioning_and_ratio(self): webdriver = WTF_WEBDRIVER_MANAGER.get_driver() webdriver.get(self.tryon_url) tryon_page = PageFactory.create_page(TryonPage) self.assertTrue(tryon_page.save_shirt_positioning_and_ratio())
def test_save_shirt_ratio_with_positioning_of_other_dragged_item(self): webdriver = WTF_WEBDRIVER_MANAGER.get_driver() webdriver.get(self.tryon_url) tryon_page = PageFactory.create_page(TryonPage) self.assertTrue(tryon_page.save_shirt_ratio_with_positioning_of_other_dragged_item())
def test_show_category_necklace(self): webdriver = WTF_WEBDRIVER_MANAGER.get_driver() webdriver.get(self.tryon_url) tryon_page = PageFactory.create_page(TryonPage) self.assertTrue(tryon_page.show_category_necklace())
def test_filter_brand_soho(self): webdriver = WTF_WEBDRIVER_MANAGER.get_driver() webdriver.get(self.tryon_url) tryon_page = PageFactory.create_page(TryonPage) self.assertTrue(tryon_page.filter_brand_soho())
def test_comment(self): webdriver = WTF_WEBDRIVER_MANAGER.get_driver() webdriver.get(self.emshare_url) emshare_page = PageFactory.create_page(EmSharePage) self.assertTrue(emshare_page.comment())
def test_goto_my_page_from_emshare(self): webdriver = WTF_WEBDRIVER_MANAGER.get_driver() webdriver.get(self.emshare_url) emshare_page = PageFactory.create_page(EmSharePage) self.assertTrue(emshare_page.goto_my_page_from_emshare())
def test_save_settings_without_tryon_items(self): webdriver = WTF_WEBDRIVER_MANAGER.get_driver() webdriver.get(self.tryon_url) tryon_page = PageFactory.create_page(TryonPage) self.assertTrue(tryon_page.save_settings_without_tryon_items())
def test_post_sharing_with_vimeo_url(self): webdriver = WTF_WEBDRIVER_MANAGER.get_driver() webdriver.get(self.emshare_url) emshare_page = PageFactory.create_page(EmSharePage) self.assertTrue(emshare_page.post_sharing_with_vimeo_url())
def test_tutorial(self): webdriver = WTF_WEBDRIVER_MANAGER.get_driver() webdriver.get(self.tryon_url) tryon_page = PageFactory.create_page(TryonPage) self.assertTrue(tryon_page.tutorial())
def create_page(page_object_class_or_interface, webdriver=None, **kwargs): """ Instantiate a page object from a given Interface or Abstract class. Args: page_object_class_or_interface (Class): PageObject class, AbstractBaseClass, or Interface to attempt to consturct. Kwargs: webdriver (WebDriver): Selenium Webdriver to use to instantiate the page. If none is provided, then it was use the default from WTF_WEBDRIVER_MANAGER Returns: PageObject Raises: NoMatchingPageError Instantiating a Page from PageObject from class usage:: my_page_instance = PageFactory.create_page(MyPageClass) Instantiating a Page from an Interface or base class:: import pages.mysite.* # Make sure you import classes first, or else PageFactory will not know about it. my_page_instance = PageFactory.create_page(MyPageInterfaceClass) Instantiating a Page from a list of classes.:: my_page_instance = PageFactory.create_page([PossiblePage1, PossiblePage2]) Note: It'll only be able to detect pages that are imported. To it's best to do an import of all pages implementing a base class or the interface inside the __init__.py of the package directory. """ if not webdriver: webdriver = WTF_WEBDRIVER_MANAGER.get_driver() # will be used later when tracking best matched page. current_matched_page = None # used to track if there is a valid page object within the set of PageObjects searched. was_validate_called = False # Walk through all classes if a list was passed. if type(page_object_class_or_interface) == list: subclasses = [] for page_class in page_object_class_or_interface: # attempt to instantiate class. page = PageFactory.__instantiate_page_object( page_class, webdriver, **kwargs) if isinstance(page, PageObject): was_validate_called = True if (current_matched_page == None or page > current_matched_page): current_matched_page = page elif page is True: was_validate_called = True # check for subclasses subclasses += PageFactory.__itersubclasses(page_class) else: # A single class was passed in, try to instantiate the class. page_class = page_object_class_or_interface page = PageFactory.__instantiate_page_object( page_class, webdriver, **kwargs) # Check if we got a valid PageObject back. if isinstance(page, PageObject): was_validate_called = True current_matched_page = page elif page is True: was_validate_called = True # check for subclasses subclasses = PageFactory.__itersubclasses( page_object_class_or_interface) # Iterate over subclasses of the passed in classes to see if we have a # better match. for pageClass in subclasses: try: page = PageFactory.__instantiate_page_object( pageClass, webdriver, **kwargs) # If we get a valid PageObject match, check to see if the ranking is higher # than our current PageObject. if isinstance(page, PageObject): was_validate_called = True if current_matched_page == None or page > current_matched_page: current_matched_page = page elif page is True: was_validate_called = True except InvalidPageError as e: _wtflog.debug("InvalidPageError: %s", e) pass # This happens when the page fails check. except TypeError as e: _wtflog.debug("TypeError: %s", e) # this happens when it tries to instantiate the original # abstract class. pass except Exception as e: _wtflog.debug("Exception during page instantiation: %s", e) # Unexpected exception. raise e # If no matching classes. if not isinstance(current_matched_page, PageObject): # Check that there is at least 1 valid page object that was passed in. if was_validate_called is False: raise TypeError( "Neither the PageObjects nor it's subclasses have implemented " + "'PageObject._validate(self, webdriver)'.") try: current_url = webdriver.current_url raise NoMatchingPageError( u("There's, no matching classes to this page. URL:{0}"). format(current_url)) except: raise NoMatchingPageError( u("There's, no matching classes to this page. ")) else: return current_matched_page
def test_choose_tryon_items(self): webdriver = WTF_WEBDRIVER_MANAGER.get_driver() webdriver.get(self.tryon_url) tryon_page = PageFactory.create_page(TryonPage) self.assertTrue(tryon_page.choose_tryon_items())
def test_use_grow_icon(self): webdriver = WTF_WEBDRIVER_MANAGER.get_driver() webdriver.get(self.tryon_url) tryon_page = PageFactory.create_page(TryonPage) self.assertTrue(tryon_page.use_grow_icon())
def test_no_signin_link_after_signin(self): webdriver = WTF_WEBDRIVER_MANAGER.get_driver() webdriver.get(self.index_url) index_page = PageFactory.create_page(IndexPage) self.assertTrue(index_page.no_signin_link_after_signin())
def wait_until_page_loaded(page_obj_class, webdriver=None, timeout=WTF_TIMEOUT_MANAGER.NORMAL, sleep=0.5, bad_page_classes=[], message=None, **kwargs): """ Waits until the page is loaded. Args: page_obj_class (Class) : PageObject class Kwargs: webdriver (Webdriver) : Selenium Webdriver. Default uses WTF_WEBDRIVER_MANAGER's instance. timeout (number) : Number of seconds to wait to allow the page to load. sleep (number) : Number of seconds to wait between polling. bad_page_classes (list) : List of PageObject classes to fail if matched. For example, ServerError page. message (string) : Use your own message with PageLoadTimeoutError raised. Returns: PageObject Raises: PageUtilOperationTimeoutError : Timeout occurred before the desired PageObject was matched. BadPageEncounteredError : One or more of the PageObject in the specified 'bad_page_classes' list was matched. Usage Example:: webdriver.get("http://www.mysite.com/login") # Wait up to 60 seconds for the page to load. login_page = wait_until_page_loaded(LoginPage, timeout=60, [ServerErrorPage]) This will wait for the login_page to load, then return a LoginPage() PageObject. """ if not webdriver: webdriver = WTF_WEBDRIVER_MANAGER.get_driver() # convert this param to list if not already. if type(bad_page_classes) != list: bad_page_classes = [bad_page_classes] end_time = datetime.now() + timedelta(seconds=timeout) last_exception = None while datetime.now() < end_time: # Check to see if we're at our target page. try: page = PageFactory.create_page( page_obj_class, webdriver=webdriver, **kwargs) return page except Exception as e: _wtflog.debug("Encountered exception: %s ", e) last_exception = e # Check to see if we're at one of those labled 'Bad' pages. for bad_page_class in bad_page_classes: try: PageFactory.create_page( bad_page_class, webdriver=webdriver, **kwargs) # if the if/else statement succeeds, than we have an error. raise BadPageEncounteredError( u("Encountered a bad page. ") + bad_page_class.__name__) except BadPageEncounteredError as e: raise e except: pass # We didn't hit a bad page class yet. # sleep till the next iteration. time.sleep(sleep) print "Unable to construct page, last exception", last_exception # Attempt to get current URL to assist in debugging try: current_url = webdriver.current_url except: # unable to get current URL, could be a webdriver for a non-webpage like mobile app. current_url = None if message: err_msg = u(message) + u("{page}:{url}")\ .format(page=PageUtils.__get_name_for_class__(page_obj_class), url=current_url) else: err_msg = u("Timed out while waiting for {page} to load. Url:{url}")\ .format(page=PageUtils.__get_name_for_class__(page_obj_class), url=current_url) raise PageLoadTimeoutError(err_msg)
def test_01_goto_signup_from_emshare_without_signin(self): webdriver = WTF_WEBDRIVER_MANAGER.get_driver() webdriver.get(self.emshare_url) emshare_page = PageFactory.create_page(EmSharePage) self.assertTrue(emshare_page.goto_signup_from_emshare_without_signin())
def get_element_xpath(element, webdriver=None): if not webdriver: webdriver = WTF_WEBDRIVER_MANAGER.get_driver() element_xpath = webdriver.execute_script("gPt=function(c){if(c.id!==''){return'id(\"'+c.id+'\")'}if(c===document.body){return c.tagName}var a=0;var e=c.parentNode.childNodes;for(var b=0;b<e.length;b++){var d=e[b];if(d===c){return gPt(c.parentNode)+'/'+c.tagName+'['+(a+1)+']'}if(d.nodeType===1&&d.tagName===c.tagName){a++}}};return gPt(arguments[0]).toLowerCase();", element) return element_xpath
def test_04_signin(self): webdriver = WTF_WEBDRIVER_MANAGER.get_driver() webdriver.get(self.base_url+'modules/index.php?pkg=account&contr=account') signin_page = PageFactory.create_page(SignInPage) self.assertTrue(signin_page.signin())
def create_page(page_object_class_or_interface, \ webdriver=None, **kwargs): """ Instantiate a page object from a given Interface or Abstract class. Args: page_object_class_or_interface (Class): PageObject class, AbstractBaseClass, or Interface to attempt to consturct. Kwargs: webdriver (WebDriver): Selenium Webdriver to use to instantiate the page. Returns: PageObject Raises: NoMatchingPageError Instantiating a Page from PageObject from class usage:: my_page_instance = PageFactory.create_page(MyPageClass) Instantiating a Page from an Interface or base class:: import pages.mysite.* # Make sure you import classes first, or else PageFactory will not know about it. my_page_instance = PageFactory.create_page(MyPageInterfaceClass) Instantiating a Page from a list of classes.:: my_page_instance = PageFactory.create_page([PossiblePage1, PossiblePage2]) Note: It'll only be able to detect pages that are imported. To it's best to do an import of all pages implementing a base class or the interface inside the __init__.py of the package directory. """ if not webdriver: webdriver = WTF_WEBDRIVER_MANAGER.get_driver() # will be used later when tracking best matched page. current_matched_page = None # Walk through all classes of this sub class if type(page_object_class_or_interface) == list: subclasses = [] for page_class in page_object_class_or_interface: #attempt to instantiate class. page = PageFactory.__instantiate_page_object(page_class, \ webdriver, \ **kwargs) if isinstance(page, PageObject) and (current_matched_page == None or page > current_matched_page): current_matched_page = page #check for subclasses subclasses += PageFactory.__itersubclasses(page_class) else: # Try the original class page_class = page_object_class_or_interface page = PageFactory.__instantiate_page_object(page_class, \ webdriver, \ **kwargs) if isinstance(page, PageObject): current_matched_page = page #check for subclasses subclasses = PageFactory.__itersubclasses( page_object_class_or_interface) # Iterate over subclasses of the passed in classes to see if we have a better match. for pageClass in subclasses: try: page = pageClass(webdriver, **kwargs) if current_matched_page == None or page > current_matched_page: current_matched_page = page except InvalidPageError as e: print_debug("InvalidPageError", e) pass #This happens when the page fails check. except TypeError as e: print_debug("TypeError", e) pass #this happens when it tries to instantiate the original abstract class. except Exception as e: print_debug("Exception", e) #Unexpected exception. raise e # If no matching classes. if not isinstance(current_matched_page, PageObject): raise NoMatchingPageError("There's, no matching classes to this page. URL:%s" \ % webdriver.current_url) else: return current_matched_page
def test_goto_hand_tryon(self): webdriver = WTF_WEBDRIVER_MANAGER.get_driver() webdriver.get(self.index_url) index_page = PageFactory.create_page(IndexPage) self.assertTrue(index_page.goto_hand_tryon())