【问题标题】:How to use __set__ and __get__ in Python Selenium PageObjects如何在 Python Selenium PageObjects 中使用 __set__ 和 __get__
【发布时间】:2021-12-19 17:46:35
【问题描述】:

我是 Python 的初学者,我正在尝试了解 Python Selenium 关于页面对象的文档:https://selenium-python.readthedocs.io/page-objects.html

setget 方法在 element.py 中的作用是什么?我们应该如何调用它们并在 page.MainPage 中使用 search_text_element?鉴于这种文件结构,我如何在网站中找到搜索文本字段,输入字符串并发送 By.RETURN?

【问题讨论】:

    标签: python selenium getter-setter getter setter


    【解决方案1】:

    您通常不会直接调用这些。当具有这些方法的对象在另一个类中用作属性时(例如,在表示网页的类中),它们将在检索到属性时自动调用(__get__)或使用=assignment 运算符编写.

    【讨论】:

    • 您好,谢谢您的回复....只是一个后续问题...那么设置element.py有什么用?
    • 如果您在链接页面的“element.py”sn-p 中询问__set__方法,它会发送传递的字符串,就好像它们是在所选页面元素上键入的一样。即page.my_element = "abcd" 的行为就像有人在“page”python 对象上的“my_element”表示的 Web 元素上键入“abcd”,该对象代表浏览器上加载的网页。
    【解决方案2】:

    通常,Python 只是获取和设置属性的值,而无需任何特殊处理,就像基本存储一样。但是,如果您正在实现Page Objects,其中Base page class 在访问每个页面对象类时被初始化,您可能需要验证正在分配的页面对象的 值。您可能希望检索一个值并将其缓存以供以后使用。

    简而言之,descriptor 是具有以下任一方法的属性值:

    • __get__(self, instance, owner):这将在检索到属性时被调用 (value = obj.attr),无论它返回什么都会被提供给请求该属性值的代码。
    • __set__():当一个值被设置为属性 (obj.attr = 'value') 时会调用它,并且根本不应该返回任何东西。
    • __delete__():从对象中删除属性时调用此方法 (del obj.attr)

    在描述符协议中。如果为属性定义了这些方法中的任何一个,则称其为descriptor


    get

    调用以获取所有者类的属性(类属性访问)或该类的实例(实例属性访问)。一个例子:

    class Ten:
        def __get__(self, obj, objtype=None):
        return 10
    
    class A:
        x = 5                       # Regular class attribute
        y = Ten()                   # Descriptor instance
    
    a = A()             # Make an instance of class A
    print(a.x)          # Normal attribute lookup
    print(a.y)          # Descriptor lookup
    

    打印:

    5
    10
    

    解释:在a.x 属性查找中,点运算符在类字典中找到'x': 5。在a.y 查找中,点运算符找到一个描述符实例,该实例由其get 方法识别。调用该方法返回 10。请注意,值 10 既不存储在类字典中,也不存储在实例字典中。相反,值 10 是按需计算的。


    这个用例

    根据element.py中的代码

    from selenium.webdriver.support.ui import WebDriverWait
    
    
    class BasePageElement(object):
        """Base page class that is initialized on every page object class."""
    
        def __set__(self, obj, value):
        """Sets the text to the value supplied"""
    
        driver = obj.driver
        WebDriverWait(driver, 100).until(lambda driver: driver.find_element_by_name(self.locator))
        driver.find_element_by_name(self.locator).clear()
        driver.find_element_by_name(self.locator).send_keys(value)
    
        def __get__(self, obj, owner):
        """Gets the text of the specified object"""
    
        driver = obj.driver
        WebDriverWait(driver, 100).until(lambda driver: driver.find_element_by_name(self.locator))
        element = driver.find_element_by_name(self.locator)
        return element.get_attribute("value")
        
    class Pages:
    
        element = BasePageElement()
    
        def __init__(self, element, value):
              self.element = element              # Calls __set__()
          self.value = value                  
    
        
    login_page = Pages(username, 'Henry')  # Sets the username field with text Henry
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 2017-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多