Python+Appium+unittest輸入具體日期來滾動選擇日期


問題:

對應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')])
View Code

 

完畢,如果哪位有更好的辦法,歡迎指教!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM