2017-04-13 2 views
2

Si j'ai plusieurs classe comme la classe Page, classe Page1, classe Page2 qui ont besoin d'utiliser la même classe Element. Afin d'obtenir self.driver à utiliser sur la classe ELement, je vais devoir dupliquer beaucoup de code de class Ele(e) à class itemWrap sur chaque class Page pour passer self.driver en entrée. Quelle est la meilleure façon pour moi de construire le code suivant?Quelle est la bonne façon de construire la classe, objet en python

# elements.py 
class Element(object): 

    def addItem(self, owner=None): 
     for _i in owner: 
      options = self.findAvaItem() 
      i = options.index(_i) 
      self.ele.find_element_by_xpath('{}/{}'.format(self.l, i)).click() 

    def delItem(self, owner=None): 
     for _i in owner: 
      options = self.findSelecItem() 
      i = options.index(_i) 
      self.ele.find_element_by_xpath('{}/{}'.format(self.l, i)).click() 

    def findAvaItem(self): 
     _o = self.driver.find_element_by_css_selector('css==div.menu.transition.visible').text 
     return _o.split('\n') 

    def findSelecItem(self): 
     _o = self.driver.find_element_by_css_selector('css==a.ui.label') 
     return [i.text for i in _o] 

# BasePage.py 
class BasePage(object): 

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

# Page.py 
from elements import Element as e 

class Ele(e): 
    def __init__(self, driver, _t): 
     self.driver = driver 
     self.l = 'element l variable' 
     self.t = _t 

class itemWrap(object): 

    def __init__(self, driver, _type): 
     self.ele = Ele(driver, _type) 
     self.driver = driver 
     self.t = _type 

    def sel_item(self, _value): 
     self.ele.addItem(_value) 

    def desel_item(self, _value): 
     self.ele.delItem(_value) 

class Page(BasePage): 
    def inputItem(self, _type, _value): 
     itemWrap(self.driver, _type).sel_item(_value) 

    def removeItem(self, _type, _value): 
     itemWrap(self.driver, _type).desel_item(_value) 

# Test.py 
from Page import Page 
from selenium import webdriver as WebDriver 

class Test(object): 

    @classmethod 
    def setup_class(cls): 
     if hasattr(super(Test, cls), 'setup_class'): 
      super(Test, cls).setup_class() 
     cls.driver = WebDriver(desired_capabilities=chrome, command_executor='127.0.0.1') 

    def check_function(self): 
     self.Page.inputItem('typeA', ['item A1', 'item A2', 'item A3']) 
     self.Page.removeItem('typeA', ['item A1', 'item A2', 'item A3']) 
     self.Page.inputItem('typeB', ['item B1', 'item B2']) 
     self.Page.removeItem('typeB', ['item B1', 'item B2']) 

Répondre

1

Il semble que vous essayez de construire une couche de façade dans votre classe itemWrap de telle sorte que chaque méthode de itemWrap passe juste le long d'un appel à self.ele. Est-ce correct?

Si tel est le cas, vous pouvez générer les fonctions à la volée. (Vous pourriez faire plus de choses automatisées s'il y avait un modèle de texte cohérent dans les noms wrap-method et element-method.) En tant que tel, vous devrez fournir un dict.)

class Ele: 
    def addItem(self, x): 
     print("Additem",x) 
    def delItem(self, x): 
     print("DelItem",x) 

class ItemWrap: 
    def __init__(self, ele): 
     self.ele = ele 

    method_map = { 
     'sel_item': 'addItem', 
     'desel_item': 'delItem', 
     # more methods go here 
    } 

for myname, elname in ItemWrap.method_map.items(): 
    msrc = "def {}(self, _value):\n" \ 
      " return self.ele.{}(_value)\n".format(myname, elname) 
    gbls = {} 
    exec(msrc, gbls) 
    setattr(ItemWrap, myname, gbls[myname]) 

e = Ele() 
i = ItemWrap(e) 
i.sel_item(10) 
i.desel_item(11) 
class Ele: 
    def addItem(self, x): 
     print("Additem",x) 
    def delItem(self, x): 
     print("DelItem",x) 

class ItemWrap: 
    def __init__(self, ele): 
     self.ele = ele 

    method_map = { 
     'sel_item': 'addItem', 
     'desel_item': 'delItem', 
     # more methods go here 
    } 

for myname, elname in ItemWrap.method_map.items(): 
    msrc = "def {}(self, _value):\n" \ 
      " return self.ele.{}(_value)\n".format(myname, elname) 
    gbls = {} 
    exec(msrc, gbls) 
    setattr(ItemWrap, myname, gbls[myname]) 

e = Ele() 
i = ItemWrap(e) 
i.sel_item(10) 
i.desel_item(11)