Python:是否可以压缩我的类似方法列表

时间:2017-06-28 21:28:31

标签: python selenium-webdriver

我有一个ID列表,我使用Selenium IDE捕获并将它们放入PyCharm。该列表如下所示:

filter_logs_query = (By.ID, "Query")
filter_logs_FromDateUI = (By.ID, "FromDateUI")
filter_logs_ToDateUI = (By.ID, "ToDateUI")
filter_logs_Ip = (By.ID, "Ip")
filter_logs_User = (By.ID, "User")  
filter_logs_Message = (By.ID, "Message")
filter_logs_RefID = (By.ID, "Refid")
filter_logs_Session = (By.ID, "Session")
filter_logs_Scope = (By.ID, "Scope")
filter_logs_EventNo = (By.ID, "EventNo")
filter_logs_Server = (By.ID, "Server")

这些ID中的每一个也都有一个def用户将send_keys发送到ID,列表如下所示:

def filter_logs_search_query(self, word):
    search_text = self.driver.find_element(*Elements.filter_logs_query)
    search_text.send_keys(word)

def filter_logs_logged_after(self, word):
    search_date = self.driver.find_element(*Elements.filter_logs_FromDateUI)
    search_date.send_keys(word)

def filter_logs_logged_before(self, word):
    search_date = self.driver.find_element(*Elements.filter_logs_ToDateUI)
    search_date.send_keys(word)

除了我需要从* Elements调用的函数之外,我的defs几乎完全相同。有没有办法可以缩小/缩短我的def列表?

3 个答案:

答案 0 :(得分:3)

这是Higher Order Functions.

的工作

每当你遇到代码相同的情况时,除了被调用的函数,最好只传递该函数(注意f):< / p>

def general_filter_logs(self, word, f):
    search_text = self.driver.find_element(*f)
    search_text.send_keys(word)

然后,可以根据广义高阶函数来定义其他函数。例如:

def filter_logs_search_query(self, word):
    general_filter_logs(word, Elements.filter_logs_query)

注意,你的重复功能不是很大,所以这里的增益并不大。然而,这种技术对于更复杂的功能尤其有用。通过推广函数总能得到的好处是,如果你需要对它进行更改,你只需要改变一个函数(通用函数)而不是所有的&#34; clone&#34;功能。

另请注意,这似乎是find_element使用的技术!它不是强迫你编写自己的自定义查找方法,而是允许你只传递一个函数。你现在需要做的就是回过头来负责选择传递什么函数的责任。

答案 1 :(得分:0)

是。您已经发送了一个包含密钥类型的字符串。使用if语句或创建使用字符串作为键的字典。

在构造函数中定义字典:

def __init__(self):
    self.query_map = {'Message':Elements.filter_logs_mesage, 'Session':Elements.filter_logs_session} # etc

然后使用字典“选择”元素:

    def filter_logs_search(self, word):
        search_text = self.driver.find_element(self.query_map[word]) 
search_text.send_keys(word)

答案 2 :(得分:0)

看起来整个事情可以被压缩到

class FilterClass:
    fields = {
        "query": "Query",
        "before": "FromDateUI",
        "after": "ToDateUI",
        "ip": "Ip",
        "user": "User",
        "msg": "Message",
        "ref": "Refid",
        "session": "Session",
        "scope": "Scope",
        "event": "EventNo",
        "server": "Server"
    }

    def filter_logs(self, field, value):
        search = self.driver.find_element(By.ID, self.fields[field])
        search.send_keys(value)