【问题标题】:Wrapping extension of WebElement objectWebElement 对象的包装扩展
【发布时间】:2022-01-23 19:25:31
【问题描述】:

我有这样的课:

class Node(WebElement):
    def __init__(self, parent, id_):
        super().__init__(parent, id_)
   ...
   <some methods, and selectors in it>

我在测试中:

nodes = [node for node in self.driver.find_element_by_xpath(node_xpath)]

当然,nodes 是一个 WebElement 列表。

我想将它转换(包装)为Node 类型的列表,所以我可以简单地使用它的好处,并拥有WebElement 对象的力量。

但我想不通。

编辑:

嗯,有时 sleep 可以解决问题(我认为): 请看看这个并给我反馈:

class Node(WebElement):
# I've got rid of arg `id_`, because the parent arg has it.
# I can only assume, that somewhere in lib, the parent arg has no `id_`  yet,
# and that is injected by argument... that is my guess
def __init__(self, parent):
    id_ = parent.id
    super().__init__(parent, id_)

...

那么为什么 WebElement 本身看起来不像这样呢?:

class WebElement(object):
    def __init__(self, parent, id_=None, w3c=False):
    self._parent = parent
    self._id = id_ if id else parent.id
    self._w3c = w3c

...不知道。这将大大简化我的生活:)

嗯,Node 设置如上,这看起来可以解决问题(我仍在检查中)

nodes = [Node(node) for node in self.driver.find_element_by_xpath(node_xpath)]

好吧,parent 参数名称现在看起来有点混乱,因为它应该是同一级别,但我想我可以接受。

编辑:

不,死路一条……

    nodes[0].is_online()
    Traceback (most recent call last):
    ...
    File "<input>", line 1, in <module>
    File "/pods_and_nodes_page.py", line 130, in is_online
    for alarm in self.find_elements_by_xpath(self.alarms_xpath):
    File "/lib/python3.8/site-packages/selenium/webdriver/remote/webelement.py", line 381, in find_elements_by_xpath
return self.find_elements(by=By.XPATH, value=xpath)
    File "/lib/python3.8/site-packages/selenium/webdriver/remote/webelement.py", line 684, in find_elements
return self._execute(Command.FIND_CHILD_ELEMENTS,
    File "/lib/python3.8/site-packages/selenium/webdriver/remote/webelement.py", line 633, in _execute
return self._parent.execute(command, params)
    File "/lib/web/common/webelement.py", line 252, in __getattribute__
return WebdriverInterceptor().func_interceptor(self, MyWebElement, attr)
    File "/lib/util/webdriver/webdriver.py", line 550, in func_interceptor
func = super(webdriver_class, webdriver).__getattribute__(attr)
      AttributeError: 'WebElement' object has no attribute 'execute'

...也许不是?看起来我的项目中有人修改了 lib... 它对你有用吗?

【问题讨论】:

    标签: python selenium selenium-webdriver


    【解决方案1】:

    尝试做这样的事情。注意:这还没有经过测试。

     @classmethod
     def from_WebElement(cls, a: WebElement):
        # Create new b_obj
        b_obj = cls()
        # Copy all values of A to B
        # It does not have any problem since they have common template
        for key, value in a.__dict__.items():
            b_obj.__dict__[key] = value
        return b_obj
    
    nodes = [Node.from_WebElement(a=node) for node in self.driver.find_element_by_xpath(node_xpath)]
    

    来自here的代码参考

    【讨论】:

    • 这是一个类方法。我需要的是一个完整的班级。
    猜你喜欢
    • 1970-01-01
    • 2017-04-16
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    相关资源
    最近更新 更多