2012-07-10 9 views
7

Derzeit versuche ich eine automatisierte Test-Suite mit Selen und Proboscis zu schreiben. Ich versuche den Webdriver zu abstrahieren und durch das Fabrikmuster zu implementieren. Hier wird auch die Klasse Page_object erstellt, die den Webtreiber beim Erstellen eines Objekts als Argument verwendet. Unten ist der Code.Factory-Muster für Selenium webdriver

 import selenium.webdriver as webdriver 
    from proboscis import TestProgram 
    from proboscis import test 
    from proboscis import before_class 
    from proboscis import after_class  

    class WebdriverFactory: 
     @staticmethod 
     def getWebdriver(browserName): 
      if(browserName == 'firefox'): 
      return webdriver.Firefox() 
      elif(browserName == 'chrome'): 
      return webdriver.Chrome() 
      elif(browserName == 'ie'): 
      return webdriver.Ie()   

      raise Exception("No such " + browserName + " browser exists") 

    class Page_Object: 
    def __init__(self, driver): 
     self.driver = driver 

    def go_to_home(self): 
     self.driver.get("http://google.com") 
     return self 
    def go_to_page(self,url): 
     self.driver.get(url) 
     return self 
    def run_search(self, url, query): 
     self.driver.get(url) 
     self.driver.find_element_by_id(locators['search_box']).send_keys(query) 
     self.driver.find_element_by_id(locators['search_button']).click() 

    def tear_down(self): 
     self.driver.close() 

    @test(groups=['selenium']) 
    class Test_Scripts: 

    @test(groups=['WebDemo']) 
    def test_1(self): 
     driver = WebdriverFactory.getWebdriver("firefox") 
     pageObj = Page_Object(driver) 
     pageObj.run_search("http://google.com",'apples') 
     pageObj.tear_down()  
    def run_tests(self): 
     TestProgram().run_and_exit() 

    Test_Scripts().run_tests() 

Ist dies der richtige Weg, dies zu tun? Oder gibt es bessere Lösungen? Wenn Sie etwas Dummes finden, dann weisen Sie bitte darauf hin und ignorieren Sie meine Nachlässigkeit, da ich neu bei Python und Selenium bin.

+1

Wirklich überrascht, dass diese Frage nicht viel Aufmerksamkeit bekommen hat :( –

Antwort

2

Sie implementieren das Seitenobjekt korrekt, indem Sie es so machen, wie es die meisten Leute tun.

Ich habe Seitenobjekte ein wenig anders gemacht - ohne dass ein Webdriver sie instanziieren muss. Weil ich oft auf mehrere Seiten mit unterschiedlichen Body-Inhalten stoße, aber identische Kopf- und Fußzeilen. Anstatt also die Header- und Footer-Locators und -Methoden in jedem Seitenobjekt zu duplizieren, habe ich ein separates Seitenobjekt nur für die Kopfzeile und nur für die Fußzeile. Aber mit einem Webtreiber, der mehrere Seitenobjekte zum Testen einer einzelnen Seite instanziierte, schien das Paradigma zu brechen. Meine Seitenobjekte sind also wirklich nur eine Sammlung von Locator und Methoden und nicht unbedingt ein Webdriver.

Ich weiß, dass Sie Kopf- und Fußzeilen nicht erwähnt haben ... Ich denke, der Grund, warum die meisten Leute ihre Seitenobjekte um einen Webdriver bauen, ist ein Paradigma, das nur 1 Seitenobjekt pro Seite annimmt. In meinem Fall hätte das zu doppeltem Code in Seitenobjekten geführt. Etwas zu beachten. Ich hoffe, das hilft!

+1

Pat Meeker, haben Sie ein Beispiel zu teilen, nach dem ich genau suche? By the way, derzeit mit [this] (https: // github. com/ncbi/robotframework-pageobjects) als Ausgangspunkt, kombiniert mit 'robot framework'. Wie du bereits erwähnt hast, gibt es gewöhnliche Objekte und nicht auf jeder Seite wiederholen. Auch nicht viel Python, um' inhertence' zu ​​bekommen Arbeiten. – Rao