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。
判斷元素是否存在
比如說我在油站詳情頁要判斷該油号下是不是有油槍,我們發現油号的上級元素是唯一的,那我們就來嘗試一下,并列印處油槍号
# 定位油槍号元素
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目錄下新增了一個圖檔,檢查後發現正是目前頁面的截圖
toast定位
就如下圖所示,不選擇油槍直接點選下一步,就會有toast提示,我們要捕獲這個toast
首先我們要引入
from selenium.webdriver.support import expected_conditions as EC
然後再寫代碼
# 直接定位到下一步并點選
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(不常用,無慣性,傳入元素)
适用于我們滑動後要定位到某一個元素的時候使用。我也不常用,有興趣的可以了解一下