セレンのフレームのイン/アウト操作をラッピングするために、Pythonクラスの内部で内部デコレータを作成したいと考えています。 Pythonクラスの内部デコレータ
class MyPage(object):
# ...
def framed(self, frame_query: str):
def decorator(function):
@functools.wraps(function)
def wrapper(*args, **kwargs):
frame = self.driver.find_element(By.XPATH, frame_query)
self.driver.switch_to.frame(frame)
out = function(*args, **kwargs)
self.driver.switch_to.default_content()
return out
return wrapper
return decorator
# ...
@framed('//myxpath/iframe')
def framed_function(self):
# ...
しかし、私はこのエラーが表示されます:だから私はこれを試してみました
TypeError: framed() missing 1 required positional argument: 'frame_query'
明らかにそれは自己を含む2つのパラメータを期待したが、それは自己について何も知らないデコレータコンテキストにされ、だから私は定義しなければならないと内側の関数 'framed_function'のソリューションをより少なくエレガント:
# My workaround
def framed_function(self):
@framed('//myxpath/iframe')
def actual_framed():
#...
actual_framed()
の提案?
デコレータがオブジェクトインスタンスにどのように追加されているのかわからないときは間違いがありますが、私はこのことを理解するために参考にしています。 – gerosalesc