微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从描述符类继承

如何解决从描述符类继承

Selenium Manual 中的此类描述符如何操作?

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,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")

我可以看到 SearchTextElement 类继承自它:

class SearchTextElement(BasePageElement):
    """This class gets the search text from the specified locator"""

    #The locator for search Box where search string is entered
    locator = 'q'

但是这个类神秘地只有一行声明了定位器(当调用 self.locator__get__() 时,它可能会输入到 __set__() 变量中)。

然后,该类依次在 MainPage 类中启动以“声明将包含检索到的文本的变量”:

class MainPage(BasePage):
    """Home page action methods come here. I.e. Python.org"""

    # Declares a variable that will contain the retrieved text
    search_text_element = SearchTextElement()

观察到在提供的测试代码中,可以通过将该变量设置为字符串来执行搜索

main_page.search_text_element = "pycon"
main_page.click_go_button()

我通常会像这样使用单个搜索功能

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("http://www.python.org")

def search(keyword):
    wait = webdriverwait(driver,100)
    search = wait.until(EC.presence_of_element_located((By.NAME,'q')))
    search.send_keys(keyword)
    search.submit()

然后只需调用(如果此函数MainPage 类中)main_page.search("pycon") 以触发搜索

问题

  1. 为什么在设计 Selenium 时这种方法不是首选 爬虫应用?
  2. 实例化 SearchTextElement() 神奇地给了我们一个变量 保持输入文本。这大概会调用 __set__ 函数来 做这份工作。如何在获取的上下文中使用它 搜索结果中某个元素的某些值?
  3. 将所有定位器放在一个地方应该是一种很好的做法 - 在 这个上下文,locators.py - 这样代码就可以很容易地 改版后可在其他网站上使用。在我自己的搜索功能中 上面,(By.NAME,'q') 可以很容易地作为常量存储在 MainPageLocators 中的 locators.py 类。一种方法应该如何 修复 SearchTextElement.locator 使其不像硬编码 上面的例子?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?