在 python 中构造 class, object 的正确方法是什么
What is the proper way to construct class, object in python
如果我有多个 Class 像 class 页面、class 页面 1、class 页面 2 需要使用相同的元素 class。为了让 self.driver 在 ELement class 上使用,我需要在每个 class Page
上复制从 class Ele(e)
到 class itemWrap
的大量代码以传递 self.driver
作为输入。我构造以下代码的最佳方法是什么?
# 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'])
您似乎正在尝试在 itemWrap
class 中构建外观层,这样 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)
如果我有多个 Class 像 class 页面、class 页面 1、class 页面 2 需要使用相同的元素 class。为了让 self.driver 在 ELement class 上使用,我需要在每个 class Page
上复制从 class Ele(e)
到 class itemWrap
的大量代码以传递 self.driver
作为输入。我构造以下代码的最佳方法是什么?
# 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'])
您似乎正在尝试在 itemWrap
class 中构建外观层,这样 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)