【appium】5. Appium WebDriver 支持的常用方法匯總

下面是一個完整的 Appium WebDriver 支持的常用方法匯總,并附上典型用法示例。

?一、元素查找方法/元素操作方法

? 使用?find_element()?和?find_elements()

from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy# 單個元素查找
el = driver.find_element(by=AppiumBy.ID, value="com.example:id/username")# 多個元素查找
els = driver.find_elements(by=AppiumBy.CLASS_NAME, value="android.widget.EditText")
? 支持的定位方式(AppiumBy):
定位方式示例值
AppiumBy.ID"com.example:id/btn_login"
AppiumBy.CLASS_NAME"android.widget.EditText"
AppiumBy.NAME"login_button"(已不推薦)
AppiumBy.XPATH"//android.widget.TextView[@text='Submit']"
AppiumBy.ACCESSIBILITY_ID"button_login"
AppiumBy.ANDROID_UIAUTOMATOR'new UiSelector().resourceId("com.example:id/login")'
AppiumBy.IOS_PREDICATE"label == 'Login'"(iOS 專用)
AppiumBy.IOS_CLASS_CHAIN"XCUIElementTypeButton[1]"(iOS 專用)

舉例說明常用的 Appium 定位方式(配合 Appium Inspector 使用)

我們以一個假設的登錄頁面為例,其中包含以下 UI 元素信息(通過 Appium Inspector 查看):

屬性
用戶名輸入框resource-id="com.example:id/username"
密碼輸入框class="android.widget.EditText"
登錄按鈕text="Login"?或?content-desc="login_button"
發送按鈕resource-id="com.example:id/send"
提交按鈕xpath="//android.widget.Button[@text='Submit']"

? 示例 1:通過?ID?定位(推薦)
from appium.webdriver.common.appiumby import AppiumBy# 定位發送按鈕
send_button = driver.find_element(by=AppiumBy.ID, value="com.example:id/send")
send_button.click()

? 示例 2:通過?XPath?定位(靈活但效率略低)
submit_button = driver.find_element(by=AppiumBy.XPATH,value="//android.widget.Button[@text='Submit']"
)
submit_button.click()

? 示例 3:通過?Class Name?定位(適用于多個同類型元素)
edit_text_list = driver.find_elements(by=AppiumBy.CLASS_NAME,value="android.widget.EditText"
)# 輸入用戶名到第一個 EditText
edit_text_list[0].send_keys("testuser")

? 示例 4:通過?Accessibility ID(content-desc)定位
login_button = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID,value="login_button"
)
login_button.click()

? 示例 5:通過?Text?定位(注意大小寫和空格)
login_button = driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().text("Login")'
)
login_button.click()

? 示例 6:模糊匹配文本(contains)
button = driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().textContains("Sub")'
)
button.click()

? 示例 7:通過?resource-id?+?text?組合定位(更穩定)
element = driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().resourceId("com.example:id/send").text("Send Message")'
)
element.click()

?? 使用new UiSelector()語法定位元素

在 Appium 自動化測試中,特別是在 Android 平臺上,new UiSelector() 是一種非常強大且靈活的定位元素方式。它屬于 Android UI Automator 提供的 API,允許你通過多種屬性組合來精確定位頁面上的控件。


1.什么是?new UiSelector()
  • UiSelector?是 Android UI Automator 提供的一個類。
  • 在 Appium 中可以通過?AppiumBy.ANDROID_UIAUTOMATOR?來使用它。
  • 它可以結合多個屬性(如?text,?resourceId,?className,?index,?description?等)進行查找,適合處理復雜的 UI 結構。
2.基本語法結構
from appium.webdriver.common.appiumby import AppiumByelement = driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().<method>(<value>)'
)

?? 注意:傳入的是一個字符串表達式,語法要嚴格符合 Java 的寫法。

3.常用方法詳解與示例
? 1.?text(String text)

根據文本內容定位控件。

driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().text("Login")'
)

適用于按鈕、TextView 等顯示文字的控件。


? 2.?textContains(String substr)

模糊匹配文本內容(包含子串)

driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().textContains("Log")'
)

? 3.?textStartsWith(String prefix)

以某個前綴開頭的文本

driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().textStartsWith("Wel")'
)

? 4.?textMatches(Pattern regex)

正則匹配文本內容

driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().textMatches("^User\\d+$")'  # 匹配 "User123"
)

? 5.?resourceId(String id)

通過資源 ID 定位控件(推薦用 AppiumBy.ID 更簡潔)

driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().resourceId("com.example:id/username")'
)

? 6.?className(String className)

通過類名定位控件(如 EditText, Button

driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().className("android.widget.Button")'
)

? 7.?description(String contentDescription)

通過 content-desc 屬性定位(Accessibility ID)

driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().description("menu_icon")'
)

? 8.?index(int index)

通過索引定位(慎用,容易變化)

# 找第一個 TextView
driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().className("android.widget.TextView").index(0)'
)

? 9.?instance(int instance)

獲取某一類控件中的第幾個實例(類似 XPath 中的 [n])

# 獲取第二個 EditText
driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().className("android.widget.EditText").instance(1)'
)

? 10. 組合使用多個條件

你可以組合多個條件來更精確地定位元素:

# 同時匹配 resourceId 和 text
driver.find_element(by=AppiumBy.ANDROID_UIAUTOMATOR,value='new UiSelector().resourceId("com.example:id/login").text("Login")'
)

? 11.注意事項
項目說明
性能比?ID?和?XPath?略慢,但比 XPath 更穩定
推薦用途復雜控件、動態內容、沒有唯一 ID 的場景
調試建議使用 Appium Inspector 查看控件屬性
只能在 Android 上使用不支持 iOS,iOS 需要用?IosUIAutomation?或?Predicate String

? 12.常見問題解答

? Q1:為什么找不到元素?

  • 控件還沒加載出來,加?time.sleep()?或顯式等待;
  • 文本大小寫不一致,注意區分;
  • 控件是動態生成的,嘗試換用其他屬性;
  • 使用?driver.page_source?查看當前頁面結構。
? 13.常用定位方式對比
定位方式示例值特點
AppiumBy.ID"com.example:id/send"推薦使用,速度快,唯一性強
AppiumBy.XPATH"//android.widget.Button[@text='Submit']"靈活但慢,適合結構化定位
AppiumBy.CLASS_NAME"android.widget.EditText"多個元素時需結合索引
AppiumBy.ACCESSIBILITY_ID"login_button"依賴無障礙描述,iOS 和 Android 都支持
AppiumBy.ANDROID_UIAUTOMATOR'new UiSelector().text("Login")'Android 專屬,強大但語法復雜

? element支持的方法

在使用 Appium 定位到元素之后,除了 click() 動作之外,還有許多其他動作可以對這些元素執行。以下是幾種常見的操作方法:

1. 輸入文本
  • send_keys():向輸入框中輸入文本。
    element = driver.find_element(by=AppiumBy.ID, value="com.example:id/username")
    element.send_keys("testuser")
2. 清除文本
  • clear():清除輸入框中的現有文本。
    element = driver.find_element(by=AppiumBy.ID, value="com.example:id/username")
    element.clear()
3. 獲取文本
  • text?屬性:獲取元素顯示的文本內容。
    element = driver.find_element(by=AppiumBy.ID, value="com.example:id/message")
    print(element.text)
4. 檢查元素是否可見或啟用
  • is_displayed():判斷元素是否對用戶可見。
  • is_enabled():檢查元素是否可用(例如按鈕是否可點擊)。
    element = driver.find_element(by=AppiumBy.ID, value="com.example:id/loginButton")
    if element.is_displayed() and element.is_enabled():element.click()
5. 獲取屬性值
  • get_attribute(name):獲取元素的特定屬性值。
    element = driver.find_element(by=AppiumBy.ID, value="com.example:id/username")
    attribute_value = element.get_attribute("name")  # 或者 "content-desc", "resource-id" 等
6. 提交表單
  • submit():對于某些支持提交的元素(如表單),可以調用此方法來提交。
    form_element = driver.find_element(by=AppiumBy.ID, value="com.example:id/loginForm")
    form_element.submit()
7. 觸摸手勢

雖然不是直接作用于元素的方法,但你可以通過 TouchAction 類對特定元素執行觸摸手勢:

  • 長按輕掃等。
    from appium.webdriver.common.touch_action import TouchActionaction = TouchAction(driver)
    action.long_press(el=element).wait(1000).release().perform()
8. 元素等待

有時候你可能需要等待某個元素變為可見或者存在:

  • 顯式等待
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as ECwait = WebDriverWait(driver, 10)
    element = wait.until(EC.visibility_of_element_located((AppiumBy.ID, "com.example:id/username")))
9. 獲取元素大小和位置
  • size?屬性?和?location?屬性:分別用于獲取元素的尺寸和屏幕上的位置。
    element = driver.find_element(by=AppiumBy.ID, value="com.example:id/username")
    print("Size:", element.size)
    print("Location:", element.location)
10. 截圖

盡管不是直接針對元素的方法,但你可以截取整個屏幕的截圖,然后根據需要裁剪出特定元素的部分:

  • driver.save_screenshot('screenshot.png'):保存當前屏幕截圖。


📱 二、移動端專屬方法(來自?MobileCommand

這些方法只能在 Appium 中使用,Selenium 不支持。

? 1. 滑動屏幕(Swipe)

driver.swipe(start_x=100, start_y=800, end_x=100, end_y=200, duration=800)

? 2. 拖拽(Drag and Drop)

driver.drag_and_drop(origin_el, destination_el)

? 3. 按下和釋放(Touch Action)

from appium.webdriver.common.touch_action import TouchActionaction = TouchAction(driver)
action.press(x=100, y=500).wait(1000).release().perform()

更推薦使用新版的 W3CActions 方式。

? 4. 啟動應用 / 關閉應用

driver.activate_app('com.example.app')        # 啟動應用
driver.background_app(5)                      # 將應用置于后臺運行5秒
driver.terminate_app('com.example.app')       # 強制停止應用

? 5. 獲取當前應用信息

print("Current Package:", driver.current_package)
print("Current Activity:", driver.current_activity)

? 6. 安裝 / 卸載應用

driver.install_app('/path/to/app.apk')
driver.remove_app('com.example.app')

? 7. 判斷是否已安裝應用

if driver.is_app_installed('com.example.app'):print("App is installed.")

? 8. 切換上下文(WebView / Native)

contexts = driver.contexts
print("Available contexts:", contexts)driver.switch_to.context(contexts[-1])  # 切換到 WebView

? 9. 獲取系統時間

print("Device time:", driver.device_time)

? 10. 發送鍵事件(如返回、菜單)

driver.press_keycode(4)  # 返回鍵 KEYCODE_BACK

? 11. 截圖

driver.save_screenshot('screen.png')

三、瀏覽器相關方法(Hybrid App 或 Webview)

如果你是在 WebView 中進行操作,可以使用類似 Selenium 的方式:

driver.get("https://example.com")
print("Current URL:", driver.current_url)
driver.back()
driver.forward()

四、鍵盤與輸入操作

el.send_keys("Hello World")
el.clear()

如果遇到中文輸入問題,可設置以下 Desired Capabilities:

'dict': {'resetKeyboard': True,'unicodeKeyboard': True
}

五、截圖與文件操作

driver.save_screenshot('test.png')  # 保存截圖
driver.get_screenshot_as_base64()   # 獲取 base64 編碼圖片

六、網絡與設備狀態

driver.is_locked()            # 是否鎖屏
driver.unlock()               # 解鎖
driver.lock(5)                # 鎖屏5秒后自動解鎖
driver.set_network_connection(6)  # 設置網絡連接類型

七、執行腳本(JavaScript、Driver Command)

result = driver.execute_script("mobile: scroll", {"direction": "down"})

你也可以直接調用底層命令:

driver.execute("mobile: longClickGesture", {"x": 100,"y": 100,"duration": 1000
})

八、會話控制

driver.quit()         # 結束當前會話
driver.close_app()    # 關閉當前應用但不結束會話

九、獲取日志(Logcat 等)

logs = driver.get_log('logcat')
for log in logs:print(log)

支持的日志類型包括:

  • logcat
  • bugreport
  • server
  • driver
  • client

十、完整方法列表(部分)

你可以通過以下方式查看所有可用的方法:

dir(driver)

或者訪問官方文檔:

🔗 Appium-Python-Client 文檔


? 總結:常用方法速查表

功能方法
查找元素find_element,?find_elements
觸摸操作swipe,?drag_and_drop,?press_keycode
應用控制activate_app,?terminate_app,?background_app
安裝卸載install_app,?remove_app,?is_app_installed
上下文切換switch_to.context()
輸入文本send_keys,?clear
截圖save_screenshot,?get_screenshot_as_base64
執行腳本execute_script,?execute
日志獲取get_log('logcat')
鎖屏操作is_locked,?unlock,?lock

如果你有具體需求或想了解某個功能的詳細用法,歡迎告訴我,我可以為你提供代碼示例!

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/news/910505.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/news/910505.shtml
    英文地址,請注明出處:http://en.pswp.cn/news/910505.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    FreeRTOS 介紹、使用方法及應用場景

    一、FreeRTOS 概述 FreeRTOS 是一款廣泛應用于嵌入式系統的實時操作系統&#xff08;RTOS&#xff09;&#xff0c;具有開源、可移植、可裁剪、輕量級等顯著特點。它最初由 Richard Barry 開發&#xff0c;如今已成為全球開發者在物聯網、工業控制、消費電子等領域的熱門選擇&a…

    深度解析 Caffeine:高性能 Java 緩存庫

    1. Caffeine 簡介 Caffeine 是一個基于 Java 8 的高性能本地緩存庫&#xff0c;由 Ben Manes 開發&#xff0c;旨在替代 Google Guava Cache&#xff0c;提供更優的緩存策略、更高的吞吐量和更靈活的配置。 核心優勢 ? 卓越的性能&#xff1a;采用優化的數據結構&#xff0…

    創客匠人賦能創始人 IP 打造:健康行業知識變現案例深度解析

    在知識服務行業蓬勃發展的當下&#xff0c;創始人 IP 打造已成為知識變現的核心驅動力。創客匠人近期披露的陪跑案例顯示&#xff0c;通過系統化的線上線下聯動運營&#xff0c;傳統行業從業者可高效實現 IP 價值轉化。以亓黃中醫科技創始人吳豐言老師為例&#xff0c;其在創客…

    64、最小路徑和

    題目&#xff1a; 解答&#xff1a; 簡單dp。 定義&#xff1a;dp[i][j]為到達(i,j)所需要的最短路程 初始化&#xff1a;dp[0][0]grid[0][0]&#xff0c;同時對第一行和第一列的&#xff0c;第i個就是前i個之和加上自身 遞歸&#xff1a;dp[i][j]min(dp[i-1][j],dp[i][j-1…

    獲取連接通義千問大語言模型配置信息的步驟:api_key、api_url

    一、注冊并開通通義千問API服務 1. 注冊阿里云賬號 訪問 阿里云官網點擊右上角"免費注冊"&#xff0c;按指引完成賬號注冊和實名認證 2. 開通通義千問API服務 進入 通義千問API產品頁點擊"立即開通"&#xff0c;按提示完成服務開通&#xff08;部分服務…

    汽車加氣站操作工考試題庫含答案【最新】

    1.天然氣的主要成分是&#xff08;&#xff09;。 A. 乙烷 B. 乙烯 C. 甲烷 D. 乙炔 答案&#xff1a;C 2.CNG 加氣站中&#xff0c;加氣機的加氣軟管應&#xff08;&#xff09;進行檢查。 A. 每天 B. 每周 C. 每月 D. 每季度 答案&#xff1a;A 3.儲氣罐的安全閥應&#xf…

    顯示任何結構的數組對象數據【向上自動滾動】

    顯示任何結構的數組對象數據 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>地圖編輯軟件 - 數…

    GPIO模式詳解

    一、GPIO的八種模式 GPIO支持4種輸入模式&#xff08;浮空輸入、上拉輸入、下拉輸入、模擬輸入&#xff09;和4種輸出模式&#xff08;開漏輸出、開漏復用輸出、推挽輸出、推挽復用輸出&#xff09;。 GPIO_Mode_AIN模擬輸入GPIO_Mode_IN_FLOATING浮空輸入GPIO_Mode_IPD下拉輸…

    django rest_framework 自定義403 Forbidden錯誤頁面

    django本來有是可以很方便自定義HTTP錯誤頁面的&#xff0c;網上資料一大把。核心是在項目的urls代碼中增加handler403的定義&#xff0c;比如&#xff1a; handler403 "app.views.your_custom_view" 404&#xff0c;500都是一樣的&#xff0c;重新定義handler404…

    Kafka Streams架構深度解析:從并行處理到容錯機制的全鏈路實踐

    在流處理技術領域&#xff0c;Kafka Streams以其輕量級架構與Kafka生態的深度整合能力脫穎而出。作為構建在Kafka生產者/消費者庫之上的流處理框架&#xff0c;它通過利用Kafka原生的分區、副本與協調機制&#xff0c;實現了數據并行處理、分布式協調與容錯能力的無縫集成。本文…

    【嵌入式硬件實例】-555定時器控制舵機/伺服電機

    555定時器控制舵機/伺服電機 文章目錄 555定時器控制舵機/伺服電機1、555定時器介紹2、舵機/伺服電機介紹3、硬件準備與接線使用 555 定時器 IC 的伺服電機控制器和測試儀電路是一個簡單的電路,可用于生成操作伺服電機所需的控制信號。該電路允許我們通過按下按鈕手動驅動/控制…

    國產麒麟 安裝可視化數據庫軟件DBeaver(圖解)

    目錄 ????????編輯DBeaver介紹 官網 通過強制使用 Ubuntu 模板來修復 add-apt-repository 重新添加 PPA 撤銷更改&#xff08;可選&#xff09; 官網直接下載 DBeaver CE 下載好后安裝軟件 啟動方式一 啟動方式二 啟動成功 在左側右擊新建連接 安裝驅動 測…

    線程池 JMM 內存模型

    線程池 & JMM 內存模型 文章目錄 線程池 & JMM 內存模型線程池線程池的創建ThreadPoolExecutor 七大參數飽和策略ExecutorService 提交線程任務對象執行的方法&#xff1a;ExecutorService 關閉線程池的方法&#xff1a;線程池最大線程數如何確定&#xff1f; volatile…

    [論文閱讀] 軟件工程 + 教學 | 軟件工程項目管理課程改革:從傳統教學到以學生為中心的混合式學習實踐

    軟件工程項目管理課程改革&#xff1a;從傳統教學到以學生為中心的混合式學習實踐 論文信息 arXiv:2506.14369 Agile and Student-Centred Teaching of Agile/Scrum Concepts Maria Spichkova Comments: Preprint. Accepted to the 29th International Conference on Knowledg…

    Windows系統提示“mfc140u.dll丟失”?詳細修復指南,一鍵恢復程序運行!

    當你興致勃勃地打開某個游戲或專業軟件時&#xff0c;突然彈出一條錯誤提示——“MFC140u.dll丟失”&#xff0c;程序直接閃退&#xff0c;讓人無比沮喪。別擔心&#xff01;這個問題并不復雜&#xff0c;通常只需重新安裝運行庫或修復系統文件即可解決。本文將為你提供詳細的修…

    云XR(AR/VR)算力底座關鍵特征與技術路徑

    云XR&#xff08;AR/VR&#xff09;算力底座是支撐擴展現實技術規模化落地的核心基礎設施&#xff0c;當前發展呈現以下關鍵特征與技術路徑&#xff1a; 一、算力架構&#xff1a;云邊端協同異構融合 分布式部署模式? 云端?&#xff1a;承擔高復雜度渲染與大數據處理&#x…

    Android開發常用adb合集

    Android開發常用adb合集 Android開發常用adb合集crash日志導出 Android開發常用adb合集 crash日志導出 bugreport: adb bugreportdropbox: adb shell dumpsys dropbox --print > desktop/full_dropbox_logs.txt

    LTspice仿真4——exp指數函數波形

    參數設置 Vinitial&#xff1a;初始電壓值 Vpulsed&#xff1a;脈沖達到值 Rise Delay&#xff1a;上升延遲時間 Rise Tau&#xff1a;上升指數系數tau Fall Delay&#xff1a;下降延遲時間 Fall Tau&#xff1a;下降指數系數tau tau決定指數波形下降或者上升快慢&#x…

    [Java 基礎]集合框架

    在 Java 中&#xff0c;我們經常需要存儲和操作一組數據&#xff0c;而集合框架就是為此而生。它提供了一套統一的接口和類&#xff0c;幫助我們高效地管理各種數據集合。 常用的集合框架中的類只有 ArrayList、LinkedList、HashSet、HashMap 這 4 個&#xff0c;這些類的繼承…

    SQL關鍵字三分鐘入門:WITH —— 公用表表達式讓復雜查詢更清晰

    在實際的數據庫開發和分析中&#xff0c;我們常常會遇到復雜的多層嵌套查詢&#xff0c;這樣的 SQL 語句不僅難以閱讀&#xff0c;也容易出錯。 這時候就需要使用一個非常實用又優雅的關鍵字 —— WITH&#xff01; 它可以幫助我們將復雜的子查詢提取出來并命名&#xff0c;從…