Python:有没有可能压缩我的类似方法列表
我有一个使用Selenium IDE捕获的ID列表,并将它们放入PyCharm中。列表如下所示:Python:有没有可能压缩我的类似方法列表,python,selenium-webdriver,Python,Selenium Webdriver,我有一个使用Selenium IDE捕获的ID列表,并将它们放入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
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")
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)
每个ID都有一个def供用户向ID发送密钥,列表如下所示:
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")
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)
除了需要从*元素调用的函数外,我的def几乎相同。有没有办法压缩/缩短def列表 是的。您已经在发送密钥类型为的字符串。使用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)
这是我的工作
每当您遇到代码相同的情况时,除了调用一个函数外,最好只传入该函数(注意f
):
然后,其他函数可以用广义高阶函数来定义。例如:
def filter_logs_search_query(self, word):
general_filter_logs(word, Elements.filter_logs_query)
注意,你的重复函数不是很大,所以这里的增益不是很大。不过,这种技术对于更复杂的函数尤其有用。泛化函数的好处是,如果需要对其进行更改,只需更改一个函数(通用函数),而不是所有“克隆”函数
还请注意,这似乎是
find_元素
使用的技术!它不强制您编写自己的自定义查找方法,而是允许您只传入一个函数。你现在需要做的就是推回谁负责挑选传递的函数的责任 看起来整个东西都可以压缩到
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)
创建一个包含所有公共代码的函数,并将不同的函数作为参数传入。如果你问我,拥有这些
def
语句一点也不坏。你有很好的函数名来描述完成的工作。