2012-07-10 19 views
7

Actualmente estoy tratando de escribir un conjunto de pruebas automatizadas utilizando Selenium y Probóscide. Estoy intentando abstraer el controlador de la web e implementarlo a través del patrón de fábrica. La clase Page_object también se crea aquí, que toma el controlador de la web como argumento al crear un objeto. A continuación está el código.Patrón de fábrica para 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() 

¿Es esta la forma correcta de hacerlo? ¿O hay mejores soluciones posibles? Si encuentra algo estúpido, por favor señale e ignore mi negligencia ya que soy nuevo en Python y Selenium.

+1

Realmente sorprendido de que esta pregunta no haya recibido mucha atención :( –

Respuesta

2

Está implementando el objeto de página correctamente, ya que lo está haciendo de la manera en que lo hace la mayoría de la gente.

He hecho los objetos de la página de una forma un tanto diferente, no requiriendo un controlador de página para crear una instancia de ellos. Porque a menudo me encuentro con varias páginas con diferentes contenidos corporales, pero con secciones idénticas de encabezado y pie de página. Entonces, en lugar de duplicar los localizadores y métodos de encabezado/pie de página en cada objeto de página, tengo un obj de página separado solo para el encabezado y solo para el pie de página. Pero luego, usar 1 webdriver para crear instancias de varios objetos de página para probar una sola página, parecía violar el paradigma. Así que mis objetos de página son en realidad solo una colección de localizadores y métodos, y no necesariamente un controlador de web.

Me doy cuenta de que no mencionó encabezados o pies de página ... Supongo que la razón por la que la mayoría de las personas crea sus objetos de página en un disco es crear un paradigma que asume solo 1 objeto de página por página. En mi caso, eso hubiera resultado en código duplicado en los objetos de la página. Algo para considerar. ¡Espero que ayude!

+1

Pat Meeker, ¿tiene algún ejemplo para compartir que estoy buscando exactamente? Por cierto, actualmente está usando [esto] (https: // github. com/ncbi/robotframework-pageobjects) como punto de partida, combinado con 'robot framework'. Como mencionaste, hay objetos comunes y no me gusta repetir en cada página. Tampoco hay muchas manos en python para obtener' inheretence' para obtenerlo trabajando. – Rao

Cuestiones relacionadas