在做自動化時經常會遇到各種各樣的時間選擇框(如下圖),那么如何去精准選擇想要的時間呢?



如果需要一個一個去點擊,那肯定非常不穩定,也很難去選擇時間跨度大的日期和精准日期。
這個時候我們就需要用到萬能的JS了,一般日期框都是只讀屬性,通過JS將只讀屬性去掉,就可以直接 send_keys()輸入時間即可

這里給個示例
# js = "document.getElementById('txtBeginDate').removeAttribute('readonly')" # 1.原生js,移除屬性
# js = "$('input[id=txtBeginDate]').removeAttr('readonly')" # 2.jQuery,移除屬性
# js = "$('input[id=txtBeginDate]').attr('readonly',false)" # 3.jQuery,設置為false
js = "$('input[id=txtBeginDate]').attr('readonly','')" # 4.jQuery,設置為空(同3)
driver.execute_script(js)
driver.find_element_by_id('txtBeginDate').send_keys('2016-08-24')
但是一般的日期輸入框很少有ID屬性,document一共有這幾種查找方式(見下圖),可以在console調試,如果能找到即可將只讀屬性去掉

但是如果通過以上方式都無法找到,該怎么處理呢?
我們可以通過 addAttribute 或者 setAttribute 給日期添加元素屬性,再使用JS將只讀屬性去掉即
def addAttribute(self, selector, attributeName, value):
'''
封裝向頁面標簽添加新屬性的方法
調用JS給頁面標簽添加新屬性,arguments[0]~arguments[2]分別
會用后面的element,attributeName和value參數進行替換
添加新屬性的JS代碼語法為:element.attributeName=value
比如input.name='test'
'''
ele = self.find_element(selector)
self.driver.execute_script("arguments[0].%s=arguments[1]" % attributeName, ele, value)
#補充說明
#ele:元素定位
#attributeName:設置屬性名
#value:設置屬性值
完整代碼實現
def send_create_time(self):
"""輸入創建時間"""
#給日期控件添加ID屬性並移除只讀屬性
self.addAttribute(data['create_time'], 'id', 456789)
js = "document.getElementById('456789').removeAttribute('readonly')"
self.execute_script(js)
return self.find_element(data['create_time']).send_keys('2020/11/15 00:00:00 - 2020/12/15 00:00:00')
補充說明:
有些使用send_keys()輸入時間但是提交請求的時候發現並沒有傳參時間,這個可能是輸入的時間格式不對,可以在頁面上手動調試,將只讀屬性去掉並發送請求,如果接口有傳參說明可以。
不行的話可以先手動選擇時間在復制粘貼即可

上圖我輸入非時間格式接口請求是沒有傳時間參數的,所以要保證傳參正確
