2017-04-13 106 views
2

如果我有多个类,如类Page,class Page1,class Page2需要使用相同的Element类。为了让self.driver在ELement类上使用,我需要将class Ele(e)class itemWrap的大量代码复制到每个class Page上,以通过self.driver作为输入。我构建下面的代码的最佳方式是什么?什么是构建类,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']) 

回答

1

好像你正试图在你的itemWrap类构建一个门面层,使得每个itemWrap方法只是一起self.ele呼叫通过。它是否正确?

如果是这样,您可以即时生成功能。 (如果在wrap-method和element-method名称中有一致的文本模式,那么你可以做更多的自动化工作。因为你必须提供一个字典。)

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) 
相关问题