2017-04-13 2 views
2

클래스 페이지와 같은 클래스, Page1 클래스, 같은 Element 클래스를 사용해야하는 클래스 Page2가있는 경우. self.driver를 ELement 클래스에서 사용하려면 self.driver을 입력으로 class Pageclass Ele(e)에서 class itemWrap까지 코드를 많이 복제해야합니다. 다음 코드를 작성하는 가장 좋은 방법은 무엇입니까? 당신이 itemWrap의 각 방법은 단지 self.ele에 대한 호출을 따라 통과하도록하여 itemWrap 클래스의 외관 층을 구축을 위해 노력하고있는 것처럼파이썬에서 클래스, 객체를 생성하는 적절한 방법은 무엇입니까

# 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

는 것 같습니다. 이 올바른지?

그렇다면 즉석에서 함수를 생성 할 수 있습니다. wrap-method와 element-method 이름에 일관된 텍스트 패턴이있는 경우 더 많은 자동화 된 작업을 수행 할 수 있습니다. 즉, 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) 
관련 문제