从描述符类继承

问题描述

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.JdbcOdbc...