问题描述
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")
以触发搜索。
问题
- 为什么在设计 Selenium 时这种方法不是首选 爬虫应用?
- 实例化
SearchTextElement()
神奇地给了我们一个变量 保持输入文本。这大概会调用__set__
函数来 做这份工作。如何在获取的上下文中使用它 搜索结果中某个元素的某些值? - 将所有定位器放在一个地方应该是一种很好的做法 - 在
这个上下文,
locators.py
- 这样代码就可以很容易地 改版后可在其他网站上使用。在我自己的搜索功能中 上面,(By.NAME,'q')
可以很容易地作为常量存储在MainPageLocators
中的locators.py
类。一种方法应该如何 修复SearchTextElement.locator
使其不像硬编码 上面的例子?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)