在做自動化時經常會遇到各種各樣的時間選擇框(如下圖),那么如何去精准選擇想要的時間呢?
如果需要一個一個去點擊,那肯定非常不穩定,也很難去選擇時間跨度大的日期和精准日期。
這個時候我們就需要用到萬能的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()輸入時間但是提交請求的時候發現並沒有傳參時間,這個可能是輸入的時間格式不對,可以在頁面上手動調試,將只讀屬性去掉並發送請求,如果接口有傳參說明可以。
不行的話可以先手動選擇時間在復制粘貼即可
上圖我輸入非時間格式接口請求是沒有傳時間參數的,所以要保證傳參正確