問題:
對應APP應用,如果有滾動選擇日期(滾動選擇其他選項也是一樣),然后想直接輸入一個日期,格式為“xxxx-xx-xx”,然后找到實現滾動選擇到所輸入的日期,怎么辦呢


下面是我的解決辦法,直接上代碼吧(方法一):
def test_04_DataReport(self,device="77250569",date="2018-1-28"): timewait=5 datelist = date.split('-') #now=datetime.datetime.now().strftime('%Y-%m-%d') #nowlist=now.split('-') #yeardiff=int(nowlist[0])-int(datelist[0]) #monthdiff=int(nowlist[1])-int(datelist[1]) #daydiff=int(nowlist[2])-int(datelist[2]) driver = self.driver assertelement = LotteryTests.isElementExist(self, "id=com.dgcy.paysx:id/more_t")#判斷數據報表元素是否可見 if assertelement: print("已登錄在APP首頁".decode("utf-8")) else: self.test_01_login()#如果不在APP首頁則重新登錄 driver.find_element_by_id("com.dgcy.paysx:id/more_t").click() # 點擊數據報表 WebDriverWait(driver, timewait).until(lambda x: x.find_element_by_id("com.dgcy.paysx:id/tickets_detail_group")) # 等待數據報表頁面可見 driver.find_element_by_id('com.dgcy.paysx:id/tickets_detail_group').click() # 點擊所有設備下拉框 WebDriverWait(driver, 5).until(lambda x: x.find_element_by_id("android:id/text1")) # 等待顯示下拉欄所有數據 driver.find_element_by_android_uiautomator('new UiSelector().clickable(true).text("%s")'% device) .click() # 點擊下拉框所輸入的設備 print("選擇的設備編號為:".decode("utf-8") + device) time.sleep(1) driver.find_element_by_id('com.dgcy.paysx:id/endTime_bt').click() # 點擊日期選擇 eleyear=driver.find_elements_by_id('android:id/numberpicker_input')[0]#當前年份元素 beforeB=driver.find_elements_by_class_name('android.widget.Button')[0].size#獲取上一格的尺寸 currentyear=eleyear.text#獲取當前默認年份 #Ybounds=eleyear.size#獲取年份的元素尺寸,年月日的高度都是一樣的 Ybounds0 = eleyear.location#獲取年份的起始位置 singlebounds = beforeB['height'] # 滑動一格的長度 print("滑動的長度為:".decode("utf-8")+str(singlebounds)) #print(Ybounds) print("起始坐標:".decode("utf-8")+str(Ybounds0)) x1 = Ybounds0['x'] # 年份起始橫坐標 y1 = Ybounds0['y'] # 年份起始縱坐標 yeardiff = int(currentyear) - int(datelist[0]) #當前年份和所選年份之差 if str(yeardiff).count('-')==1 and str(yeardiff)[0] == '-': y2 = Ybounds0['y']-singlebounds#如果年份之差為負數則向上滑動 swipecount=int(str(yeardiff)[1]) else: y2 = singlebounds + Ybounds0['y'] #如果年份之差為負數則向下滑動 swipecount = yeardiff if swipecount > 0: for i in range(0,swipecount): eleyear.click() driver.swipe(x1, y1, x1, y2) # 年份滑動一格 if eleyear.text == str(int(datelist[0])) : print("輸入日期正確:".decode("utf-8")+eleyear.text+"年".decode("utf-8")) break else: print("輸入日期正確:".decode("utf-8") + eleyear.text + "年".decode("utf-8")) #print(eleyear.text) elemonth = driver.find_elements_by_id('android:id/numberpicker_input')[1] # 當前月份元素 currentmonth = elemonth.text # 獲取當前默認月份 #Mbounds = elemonth.size # 獲取月份的元素尺寸,年月日的高度都是一樣的 Mbounds0 = elemonth.location # 獲取月份的起始位置 x1 = Mbounds0['x'] # 月份起始橫坐標 y1 = Mbounds0['y'] # 月年份起始縱坐標 monthdiff = int(currentmonth) - int(datelist[1]) # 當前月份和所選月份之差 if str(monthdiff).count('-') == 1 and str(monthdiff)[0] == '-': y2 = Mbounds0['y'] - singlebounds # 如果月份之差為負數則向上滑動 swipecount = int(str(monthdiff)[1]) else: y2 = singlebounds + Mbounds0['y'] # 如果月份之差為負數則向下滑動 swipecount = monthdiff if swipecount>0: for i in range(0,swipecount): elemonth.click() driver.swipe(x1, y1, x1, y2) # 月份滑動一格 if elemonth.text == str(int(datelist[1])) : print("輸入日期正確:".decode("utf-8") + elemonth.text+"月".decode("utf-8")) break else: print("輸入日期正確:".decode("utf-8") + elemonth.text + "月".decode("utf-8")) #print(elemonth.text) eleday = driver.find_elements_by_id('android:id/numberpicker_input')[2] # 當前日元素 currentday = eleday.text # 獲取當前默認日 #Dbounds = eleday.size # 獲取日的元素尺寸,年月日的高度都是一樣的 Dbounds0 = eleday.location # 獲取日的起始位置 x1 = Dbounds0['x'] # 日起始橫坐標 y1 = Dbounds0['y'] # 日份起始縱坐標 daydiff = int(currentday) - int(datelist[2]) # 當前日和所選日之差 if str(daydiff).count('-') == 1 and str(daydiff)[0] == '-': y2 = Dbounds0['y'] - singlebounds # 如果日之差為負數則向上滑動 swipecount = int(str(daydiff)[1]) else: y2 = singlebounds + Dbounds0['y'] # 如果日之差為負數則向下滑動 swipecount = daydiff if swipecount > 0: for i in range(0,swipecount): eleday.click() driver.swipe(x1, y1, x1, y2) # 日滑動一格 if str(eleday.text) == str(datelist[2]) : print("輸入日期正確:".decode("utf-8") + eleday.text+"日".decode("utf-8")) break else: print("輸入日期正確:".decode("utf-8") + eleday.text + "日".decode("utf-8")) #print(eleday.text) driver.find_elements_by_id('com.dgcy.paysx:id/date_picker_ok')#點擊確定 driver.find_elements_by_id('com.dgcy.paysx:id/search_adv') # 點擊查詢
方法二:
driver.find_element_by_id('com.dgcy.paysx:id/endTime_bt').click() # 點擊日期選擇 eles=driver.find_elements_by_id('android:id/numberpicker_input') eles[0].clear()#清除年份 eles[0].send_keys(datelist[0])#重新輸入年份 text=eles[0].text print("選擇的年份為:".decode("utf-8")+text) eles[1].clear() # 清除月份 eles[1].send_keys(datelist[1]) # 重新輸入月份 text = eles[1].text print("選擇的月份為:".decode("utf-8") + text) eles[2].clear() # 清除日份 eles[2].send_keys(datelist[2]) # 重新輸入日份 text = eles[2].text print("選擇的日份為:".decode("utf-8") + text)
方法一的思路就是先做出滑動一格的效果,然后默認年份與所輸入的年份相減,如果為正的話循環向下滑動,如果為負則循環向上滑動,滑動格數為相減的絕對數。
方法二的思路是直接清除元素的text(輸入框標簽為input),然后直接輸入想要滑動的日期。
順便把全部代碼也附上吧
import unittest import time import datetime from appium import webdriver #from HtmlTestRunner import HTMLTestRunner from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.action_chains import ActionChains import sys reload(sys) sys.setdefaultencoding('utf8') count = 0 login = { "username":"18520836380", "userpwd":"123456", "newsever":"http://192.168.0.112:9988/agent_client" } startime=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) class LotteryTests(unittest.TestCase): def setUp(self): #初始化測試平台 desired_caps = { 'platformName': 'Android', #移動操作平台 'platformVersion': '4.4.2', # 移動操作系統版本 'newCommandTimeout': '3600', # 自定義超時時間 'deviceName': '127.0.0.1:62001',#設備名稱 'appPackage': 'com.dgcy.paysx', # 測試APP的包名 'app':'E://sx_station_pay_android.apk', 'appActivity': 'com.dgcy.pay.ui.activity.StartTicketsActivity',# 要從包中啟動的Android活動的活動名稱 'automationName': 'Appium', #自動化引擎 # 'unicodeKeyboard':True, # 'resetKeyboard':True, 'noReset':True, 'chromeOptions':{'androidProcess': 'com.dgcy.paysx'} } print(startime+': 打開APP...'.decode("utf-8")) self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps) time.sleep(5) def isElementExist(self, locator): """ locator: locator輸入規則:元素屬性名=元素屬性值,如果是id則以"id=xxx",如果是css則以“css=xxx”等,例如:id=com.dgcy.paysx:id/monitor_t;css=div.popup-content; xpath=//div[text()='刪除成功'];name=myna;class=mmv;link=登錄; :return: 布爾值 """ list=locator.split('=') flag = True browser = self.driver try: if list[0] == "id": browser.find_element_by_id(list[1]) elif list[0] == "xpath": browser.find_element_by_xpath(list[1]) elif list[0] == "name": browser.find_element_by_namne(list[1]) elif list[0] == "css": browser.find_element_by_css_selector(list[1]) elif list[0] == "class": browser.find_element_by_class_name(list[1]) elif list[0] == "tag": browser.find_element_by_tag_name(list[1]) elif list[0] == "link": browser.find_element_by_link_text(u"%s" % list[1]) return flag except: flag = False return flag #def test_01_login(self): #打開app並判斷是否自動登錄 # print("Start test1...open application") # time.sleep(2) # #判斷是否需要登錄 # driver = self.driver # assertelement=LotteryTests.isElementExist(self,"id=com.dgcy.paysx:id/monitor_t") # if not assertelement:# # loging = driver.find_element_by_id("com.dgcy.paysx:id/login_submit").text # try: # assert '登錄' in loging #檢測到登錄按鈕 # print("檢測到登錄按鈕,重新登錄....") # #輸入用戶名 # driver.find_element_by_id("com.dgcy.paysx:id/loginUserName").send_keys(login["username"]) # #輸入密碼 # driver.find_element_by_id("com.dgcy.paysx:id/loginPwd").send_keys(login["userpwd"]) # #輸入服務器設置 # driver.find_element_by_id("com.dgcy.paysx:id/fwurl").send_keys(login["newsever"]) # time.sleep(1) # #點擊登錄 # driver.find_element_by_id("com.dgcy.paysx:id/login_submit").click() # except AssertionError as e: # print("未檢測到登錄按鈕....") # else: # print("已登錄在APP首頁") # time.sleep(2)# #def test_02_firstPage(self): # # 檢測‘實時訂單’ # driver = self.driver # count=10 # assertelement = LotteryTests.isElementExist(self, "id=com.dgcy.paysx:id/monitor_t") # if assertelement: # firstPage = driver.find_element_by_id("com.dgcy.paysx:id/index_t").text # # 添加斷言是否顯示“實時訂單” # try: # assert '實時訂單' in firstPage # print("Login User is Right!") # except AssertionError as e: # print('loginUser is Error') # self.test_01_login() #非‘實時訂單’則重新登錄 # else: # self.test_01_login() # while count == 0: # driver.find_element_by_id("com.dgcy.paysx:id/tickets_detail_group").click()#點擊下拉按鈕 # WebDriverWait(driver, 5).until(lambda x: x.find_element_by_id("android:id/text1"))#等待顯示下拉欄所有數據 # driver.find_element_by_android_uiautomator("new UiSelector().index(0)").find_element_by_id("android:id/text1").click() # for i in range(9): # driver.find_element_by_id("com.dgcy.paysx:id/tickets_detail_group").click() # time.sleep(1) # driver.find_elements_by_id('android:id/text1')[i].click() # time.sleep(9) #def test_03_allTicket(self): # # 檢測‘運營監控’ # timewait=5 # driver = self.driver # assertelement = LotteryTests.isElementExist(self, "id=com.dgcy.paysx:id/monitor_t") # if assertelement: # firstPage = driver.find_element_by_id("com.dgcy.paysx:id/monitor_t").text # # 添加斷言是否顯示“運營監控” # try: # assert '運營監控' in firstPage # print("Login User is Right!") # except AssertionError as e: # print('loginUser is Error') # self.test_01_login() # 非‘運營監控’則重新登錄 # else: # self.test_01_login() # driver.find_element_by_id("com.dgcy.paysx:id/monitor_t").click() # 點擊運營監控 # WebDriverWait(driver, timewait).until(lambda x: x.find_element_by_id("com.dgcy.paysx:id/rb_all")) # 等待顯示所有數據 # print("正在每隔"+str(timewait)+"s循環獲取到所有設備的狀態.....") # driver.find_element_by_id('com.dgcy.paysx:id/rb_all').click() # 點擊‘全部’ # while count == 0: # driver.find_element_by_id('com.dgcy.paysx:id/rb_all').click() # 點擊‘全部’ # #print("等待了"+str(timewait)+"s,獲取到所有設備的狀態.....") # time.sleep(timewait) def getsize(self): x = self.driver.get_window_size()['width'] y = self.driver.get_window_size()['height'] return (x, y) def test_04_DataReport(self,device="77250569",date="2018-1-28"): timewait=5 datelist = date.split('-') #now=datetime.datetime.now().strftime('%Y-%m-%d') #nowlist=now.split('-') #yeardiff=int(nowlist[0])-int(datelist[0]) #monthdiff=int(nowlist[1])-int(datelist[1]) #daydiff=int(nowlist[2])-int(datelist[2]) driver = self.driver assertelement = LotteryTests.isElementExist(self, "id=com.dgcy.paysx:id/more_t")#判斷數據報表元素是否可見 if assertelement: print("已登錄在APP首頁".decode("utf-8")) else: self.test_01_login()#如果不在APP首頁則重新登錄 driver.find_element_by_id("com.dgcy.paysx:id/more_t").click() # 點擊數據報表 WebDriverWait(driver, timewait).until(lambda x: x.find_element_by_id("com.dgcy.paysx:id/tickets_detail_group")) # 等待數據報表頁面可見 driver.find_element_by_id('com.dgcy.paysx:id/tickets_detail_group').click() # 點擊所有設備下拉框 WebDriverWait(driver, 5).until(lambda x: x.find_element_by_id("android:id/text1")) # 等待顯示下拉欄所有數據 #cc=self.getsize() #print("手機屏幕大小為:".decode("utf-8")+str(cc)) driver.find_element_by_android_uiautomator('new UiSelector().clickable(true).text("%s")'% device) .click() # 點擊下拉框所輸入的設備 print("選擇的設備編號為:".decode("utf-8") + device) time.sleep(1) driver.find_element_by_id('com.dgcy.paysx:id/endTime_bt').click() # 點擊日期選擇 eleyear=driver.find_elements_by_id('android:id/numberpicker_input')[0]#當前年份元素 beforeB=driver.find_elements_by_class_name('android.widget.Button')[0].size#獲取上一格的尺寸 currentyear=eleyear.text#獲取當前默認年份 #Ybounds=eleyear.size#獲取年份的元素尺寸,年月日的高度都是一樣的 Ybounds0 = eleyear.location#獲取年份的起始位置 singlebounds = beforeB['height'] # 滑動一格的長度 print("滑動的長度為:".decode("utf-8")+str(singlebounds)) #print(Ybounds) print("起始坐標:".decode("utf-8")+str(Ybounds0)) x1 = Ybounds0['x'] # 年份起始橫坐標 y1 = Ybounds0['y'] # 年份起始縱坐標 yeardiff = int(currentyear) - int(datelist[0]) #當前年份和所選年份之差 if str(yeardiff).count('-')==1 and str(yeardiff)[0] == '-': y2 = Ybounds0['y']-singlebounds#如果年份之差為負數則向上滑動 swipecount=int(str(yeardiff)[1]) else: y2 = singlebounds + Ybounds0['y'] #如果年份之差為負數則向下滑動 swipecount = yeardiff if swipecount > 0: for i in range(0,swipecount): eleyear.click() driver.swipe(x1, y1, x1, y2) # 年份滑動一格 if eleyear.text == str(int(datelist[0])) : print("輸入日期正確:".decode("utf-8")+eleyear.text+"年".decode("utf-8")) break else: print("輸入日期正確:".decode("utf-8") + eleyear.text + "年".decode("utf-8")) #print(eleyear.text) elemonth = driver.find_elements_by_id('android:id/numberpicker_input')[1] # 當前月份元素 currentmonth = elemonth.text # 獲取當前默認月份 #Mbounds = elemonth.size # 獲取月份的元素尺寸,年月日的高度都是一樣的 Mbounds0 = elemonth.location # 獲取月份的起始位置 x1 = Mbounds0['x'] # 月份起始橫坐標 y1 = Mbounds0['y'] # 月年份起始縱坐標 monthdiff = int(currentmonth) - int(datelist[1]) # 當前月份和所選月份之差 if str(monthdiff).count('-') == 1 and str(monthdiff)[0] == '-': y2 = Mbounds0['y'] - singlebounds # 如果月份之差為負數則向上滑動 swipecount = int(str(monthdiff)[1]) else: y2 = singlebounds + Mbounds0['y'] # 如果月份之差為負數則向下滑動 swipecount = monthdiff if swipecount>0: for i in range(0,swipecount): elemonth.click() driver.swipe(x1, y1, x1, y2) # 月份滑動一格 if elemonth.text == str(int(datelist[1])) : print("輸入日期正確:".decode("utf-8") + elemonth.text+"月".decode("utf-8")) break else: print("輸入日期正確:".decode("utf-8") + elemonth.text + "月".decode("utf-8")) #print(elemonth.text) eleday = driver.find_elements_by_id('android:id/numberpicker_input')[2] # 當前日元素 currentday = eleday.text # 獲取當前默認日 #Dbounds = eleday.size # 獲取日的元素尺寸,年月日的高度都是一樣的 Dbounds0 = eleday.location # 獲取日的起始位置 x1 = Dbounds0['x'] # 日起始橫坐標 y1 = Dbounds0['y'] # 日份起始縱坐標 daydiff = int(currentday) - int(datelist[2]) # 當前日和所選日之差 if str(daydiff).count('-') == 1 and str(daydiff)[0] == '-': y2 = Dbounds0['y'] - singlebounds # 如果日之差為負數則向上滑動 swipecount = int(str(daydiff)[1]) else: y2 = singlebounds + Dbounds0['y'] # 如果日之差為負數則向下滑動 swipecount = daydiff if swipecount > 0: for i in range(0,swipecount): eleday.click() driver.swipe(x1, y1, x1, y2) # 日滑動一格 if str(eleday.text) == str(datelist[2]) : print("輸入日期正確:".decode("utf-8") + eleday.text+"日".decode("utf-8")) break else: print("輸入日期正確:".decode("utf-8") + eleday.text + "日".decode("utf-8")) #print(eleday.text) driver.find_element_by_id('com.dgcy.paysx:id/date_picker_ok').click()#點擊確定 driver.find_element_by_id('com.dgcy.paysx:id/search_adv').click() # 點擊查詢 #elm = driver.find_elements_by_id('android:id/text1') # 獲取下拉所有元素 #driver.find_elements_by_id("android:id/text1")[0].click()#點擊下拉框第一個元素 #print elm #num=len(elm) #print(num) #num=num-1 #for i in range(num): # driver.find_element_by_id("com.dgcy.paysx:id/tickets_detail_group").click()#點擊設備下拉按鈕 # time.sleep(1) # driver.find_elements_by_id('android:id/text1')[i].click()#在下拉選擇框選擇設備並點擊 # deviceNO=driver.find_elements_by_id('android:id/text1')[i].text()#獲取設備編號 # print("選擇的設備編號為:".decode("utf-8")+deviceNO) # time.sleep(1) # driver.find_element_by_id('com.dgcy.paysx:id/endTime_bt').click()#點擊日期選擇 # print("點擊並選擇日期".decode("utf-8")) # time.sleep(1) time.sleep(10) def tearDown(self): self.driver.quit() if __name__ == '__main__': #構造測試套件 suite = unittest.TestSuite(tests=[LotteryTests('test_04_DataReport')])
完畢,如果哪位有更好的辦法,歡迎指教!
