天天看點

appium之滑動螢幕+判斷元素是否存在+截圖+toast定位appium之滑動螢幕+判斷元素是否存在+截圖+toast定位

appium之滑動螢幕+判斷元素是否存在+截圖+toast定位

基礎代碼

import time

from appium import webdriver
from selenium.webdriver.support.wait import WebDriverWait

server = 'http://localhost:4723/wd/hub'
caps = {
    "platformName": "Android",
    "deviceName": "JPF4C19123011893",
    "platformVersion": "10.0",
    "appPackage": "com.czb.webczbdemo",
    "appActivity": "com.czb.webczbdemo.MainActivity",
    "automationName": "uiautomator2",
    "noReset": "true",
    "unicodeKeyboard": "true",
     "resetKeyboard": "true"
}
driver = webdriver.Remote(server, caps)
wait = WebDriverWait(driver, 30)

#通過find_element_by_id來擷取元素
navigation_button = driver.find_element_by_id("com.czb.webczbdemo:id/webNavigation")
#點選元素
navigation_button.click()
#等待3秒
time.sleep(3)
#通過find_element_by_class_name來定位元素
edit_text = driver.find_element_by_class_name("android.widget.EditText")
#将元素中的内容清空
edit_text.clear()
#等待3秒
time.sleep(3)
#将新的位址放到輸入框中
edit_text.send_keys("https://test-open.czb365.com/redirection/todo/?platformType=92611011&platformCode=18610899775")
#通過find_element_by_class_name來定位元素
commit_button = driver.find_element_by_class_name("android.widget.Button")
#點選前往按鈕
commit_button.click()
#通過find_elements來查找有相同定位資訊的一組元素
oilstation = driver.find_elements_by_class_name("android.view.View")
#将元素資訊列印出來
print(oilstation)
#列印這一組資訊的資料類型
print(type(oilstation))
#通過xpath來定位元素并點選
stationone=driver.find_element_by_xpath("//*[@text='ZZ測試油站就将盡快盡快架構開卡']").click()
           

現在,我們進入了油站詳情頁面,但是我們想傳回到油站清單頁怎麼辦,這個頁面是沒有傳回按鈕的,那我們就需要左滑右滑,而且這個頁面是展示的不全的,我們需要上滑和下滑來檢視完成的頁面資訊,而且我們還需要判斷一個元素存在不存在,甚至我們還想截個圖,還有一個場景,如果我們不選擇油槍就直接點選下一步,是會有toast的,怎麼定位這個toast。

判斷元素是否存在

比如說我在油站詳情頁要判斷該油号下是不是有油槍,我們發現油号的上級元素是唯一的,那我們就來嘗試一下,并列印處油槍号

appium之滑動螢幕+判斷元素是否存在+截圖+toast定位appium之滑動螢幕+判斷元素是否存在+截圖+toast定位
# 定位油槍号元素
oilgun = driver.find_element_by_class_name("android.widget.ListView").find_element_by_class_name("android.view.View")
# 列印油槍号資訊
print(oilgun.text)


# 判斷元素是否存在,注意傳的是字元串
def is_element_exist(elementString):
    # 擷取頁面的所有元素
    source = driver.page_source
    if elementString in source:
        return True
    else:
        return False


print(is_element_exist("5号"))
           

結果

5号
True
           

截圖

我們在項目的下級目錄建立一個檔案夾,名為screenshot

#擷取時間資訊
timeNow = time.strftime("%Y-%m-%d %H-%M-%s")
#擷取目前檔案的上級目錄
folder = os.path.dirname(__file__)
#拼接檔案路徑到我們建立的screenshot
image_folder = os.path.join(folder, "screenshot")
#拼接圖檔路徑和檔案名
image =image_folder+"/"+timeNow+".png"
#截圖
driver.get_screenshot_as_file(image)
           

執行後發現screenshot目錄下新增了一個圖檔,檢查後發現正是目前頁面的截圖

appium之滑動螢幕+判斷元素是否存在+截圖+toast定位appium之滑動螢幕+判斷元素是否存在+截圖+toast定位

toast定位

就如下圖所示,不選擇油槍直接點選下一步,就會有toast提示,我們要捕獲這個toast

首先我們要引入

from selenium.webdriver.support import expected_conditions as  EC 
           
appium之滑動螢幕+判斷元素是否存在+截圖+toast定位appium之滑動螢幕+判斷元素是否存在+截圖+toast定位

然後再寫代碼

# 直接定位到下一步并點選
driver.find_element_by_xpath("//*[@text='下一步']").click()
# 定位toast資訊:通過xpath的方式尋找,//代表目前目錄下的,*代表所有的,包含了'請選擇油槍'文案的元素
please = ("xpath", "//*[contains(@text,'請選擇油槍')]")


def get_toast(toast_element):
    #等待10秒,每0.1秒找一次,until直到這個toast出現
    wait_toast = WebDriverWait(driver, 10, 0.1).until(EC.presence_of_element_located(toast_element))
    #列印toast的文案
    print(wait_toast.text)


get_toast(please)
           

結果

請選擇油槍
           

滑動

名詞解釋:慣性,就好像你上下滑動一下螢幕,滑得很快,手指放開之後螢幕還是在滑動,這就叫有慣性。

我們首先要明确螢幕的坐标,是以螢幕的左上角為原點,向左為 x,向下為 y

scoll(不常用,有慣性,傳入元素)

我也不常用,有興趣的可以了解一下

TouchAction(不常用)

最常用的場景就是九宮格解鎖,我們需要一直按壓着螢幕,但是這個功能到現在我也沒用過,有興趣的可以了解一下

swipe(常用,可以設定是否有慣性,傳入的是坐标)

比如說我們的油站詳情頁,隻有通過右滑才可以回到油站清單頁,回到油站清單頁後再上下滑動螢幕,下面這段代碼就完成上述操作。

# 首先我們要擷取螢幕的高度和寬度
def get_size():
    # 擷取螢幕大小,傳回的是一個字典
    size = driver.get_window_size()
    # 擷取寬和高并傳回
    width = size['width']
    height = size['height']
    return width, height


# 向左滑動,左右滑動,高度是不變的,是以隻要有一個y就可以了
def swipe_left():
    # x1為螢幕寬度分為10等份,從左數向右第9個等份處
    x1 = get_size()[0] / 10 * 9
    # 從螢幕高度的中間滑動
    y1 = get_size()[1] / 2
    # x為螢幕寬度分為10等份,從左向右數第1個等份處
    x = get_size()[0] / 10
    driver.swipe(x1, y1, x, y1)


# 向右滑動,左右滑動,高度是不變的,是以隻要有一個y就可以了
def swipe_right():
    # x1為螢幕寬度分為10等份,從左數向右第1個等份處
    x1 = get_size()[0] / 10
    # 從螢幕高度的中間滑動
    y1 = get_size()[1] / 2
    # x為螢幕寬度分為10等份,從左向右數第9個等份處
    x = get_size()[0] / 10 * 9
    driver.swipe(x1, y1, x, y1)


# 向右滑動,左右滑動,高度是不變的,是以隻要有一個y就可以了
# 咱們通過詳情頁跳轉到清單頁面是需要從最左側開始滑動的,是以我們需要改一下向右滑動的方法
def swipe_right_zero():
    # 就是螢幕的最左邊
    x1 = get_size()[0] *0
    # 從螢幕高度的中間滑動
    y1 = get_size()[1] / 2
    # x為螢幕寬度分為10等份,從左向右數第9個等份處
    x = get_size()[0] / 10 * 9
    driver.swipe(x1, y1, x, y1)


# 向上滑動,上下滑動,寬是不變的,是以隻要有一個x就可以了
def swipe_up():
    # 從螢幕寬度的中間滑動
    x1 = get_size()[0] / 2
    # y1為螢幕搞得分為10等份,從上向下數第9個等份
    y1 = get_size()[1] / 10 * 9
    # y為螢幕搞得分為10等份,從上向下數第1個等份
    y = get_size()[1] / 10
    driver.swipe(x1, y1, x1, y)


# 向下滑動,上下滑動,寬是不變的,是以隻要有一個x就可以了
def swipe_down():
    # 從螢幕寬度的中間滑動
    x1 = get_size()[0] / 2
    # y1為螢幕搞得分為10等份,從上向下數第1個等份
    y1 = get_size()[1] / 10
    # y為螢幕搞得分為10等份,從上向下數第9個等份
    y = get_size()[1] / 10 * 9
    driver.swipe(x1, y1, x1, y)


# 向下滑動,上下滑動,寬是不變的,是以隻要有一個x就可以了
# 但是我們觀察一下我們的清單頁,螢幕y軸距離原點1/10處,你滑動是沒有用的,需要從油站清單處滑動。是以我們将滑動的點向下移動
# 是以appium不難,但是各種具體問題具體分析調試起來很難
def swipe_down_czb():
    # 從螢幕寬度的中間滑動
    x1 = get_size()[0] / 2
    # y1為螢幕搞得分為10等份,從上向下數第4個等份
    y1 = get_size()[1] / 10*4
    # y為螢幕搞得分為10等份,從上向下數第9個等份
    y = get_size()[1] / 10 * 9
    driver.swipe(x1, y1, x1, y)


swipe_right_zero()
swipe_up()
swipe_down_czb()
           

drag_and_drop(不常用,無慣性,傳入元素)

适用于我們滑動後要定位到某一個元素的時候使用。我也不常用,有興趣的可以了解一下

繼續閱讀