日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

appium===元素定位

發(fā)布時間:2025/5/22 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 appium===元素定位 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、常用識別元素的工具 uiautomator:Android SDK自帶的一個工具,在tools目錄下 monitor:Android SDK自帶的一個工具,在tools目錄下 Appium Inspector:Appium自帶的一個功能,只有mac下可以使用該功能 ? 下面是用monitor抓取到的頁面元素 ? 下面使用Appium Inspector定位的元素 ? 二、元素定位 ? 1.格式:find_element_by_定位方式(value) ? 通過id定位 (取resource-id的值): driver.find_element_by_id("com.wuba.zhuanzhuan:id/azo") 也可以直接用id后面的內(nèi)容driver.find_element_by_id("azo") ? 通過class_name定位 (取class的內(nèi)容) driver.find_element_by_class_name("android.widget.RelativeLayout") ? 通過xpath定位 (取xpath得內(nèi)容) driver.find_element_by_xpath("//android.widget.LinearLayout[1]/android.widget.XXX") ? 通過text定位 (需要使用uiautomator的定位方式,使用text的內(nèi)容) driver.find_elements_by_android_uiautomator("new?UiSelector().text(\"+關(guān)注\")") ? 使用這里需要注意一下,通過text定位的結(jié)果是個list,不能直接click。所以如果要點擊需要取數(shù)組的值,比如下面是點擊找到的第一個元素 driver.find_elements_by_android_uiautomator("new?UiSelector().text(\"+關(guān)注\")")[0].click() ? 通過css_selector定位(webview) 只適用于webview的html頁面,繼承自webdriver,與pc版本的UI測試一致 driver.find_element_by_css_selector() ? 通過link_text定位(webview) 只適用于webview容器中的html頁面,繼承自webdriver,與pc版本的UI測試一致 driver.find_element_by_link_text() ? 通過name定位 web view容器中的html頁面可以用name定位,native并沒有name屬性 driver.find_element_by_name() ?? 2.定位元素的另一種寫法:find_element(by,value) find_element_by_方式(value)實際調(diào)用的都是find_element(by,value) 需要導入這個包:from?selenium.webdriver.common.by?import?By ? 例如:定位id為ag2的元素 方式一:driver.find_element_by_id("ag2) 方式二:driver.find_element(By.ID,"ag2") ? 這個操作的好處是可以直接把操作的by和value放到一個元組里,然后調(diào)用通用方法來傳參獲得元素結(jié)果 cateid=(By.ID,"ag2") driver.find_element(*cateid).click() ? by的操作可以是: By.ID ? 相當于by_id By.CLASS_NAME ?相當于by_class_name By.XPATH ? 相當于by_xpath By.NAME ? 相當于by_name By.TAG_NAME ? 相當于by_tag_name By.CSS_SELECTOR ?相當于by_css_selector By.LINK_TEXT ?相當于by_link_text ? ? 3.find_elements_by_定位方式(value)返回元素數(shù)組 用法與find_element_by_方式(value)一致,但是返回一個數(shù)組。可以通過數(shù)組的索引來訪問具體的某個結(jié)果 ? 例如:通過class_name定位到多個元素,我想點擊第一個元素 driver.find_elements_by_class_name("android.widget.RelativeLayout)[0].click() ? 4.返回元素數(shù)組的另一種寫法:find_elements(by,value) 用法與find_element(by,value)一致,但是返回一個數(shù)組。可以通過數(shù)組的索引來訪問具體的某個結(jié)果 ? 例如:通過class_name定位到多個元素,我想點擊第一個元素 driver.find_elements(By.CLASS_NAME,"android.widget.RelativeLayout)[0].click() ? 5.通過元素定位元素 可以先找到某個元素,然后再進一步定位元素 find_element_by_class_xpath(“xxx”).find_element_by_name(“yyy") ? ? 三、元素操作 ? 找到元素后可以對元素進行的操作,例如上面講的進一步定位元素 ? 1.click() //點擊操作 也可以用tab實現(xiàn)點擊操作 driver.find_element_by_id("com.wuba.zhuanzhuan:id/ae8").click() ? 2.clear() //清空輸入框內(nèi)容 driver.find_element_by_id("com.wuba.zhuanzhuan:id/ij").clear() ? 3.send(xx) //輸入框內(nèi)輸入內(nèi)容 driver.find_element_by_id("com.wuba.zhuanzhuan:id/ij").send_keys("test?content") ? 4.text //獲得元素的text內(nèi)容 print(driver.find_element_by_xpath("?//android.widget.LinearLayout[1]//xxx").text) ? ? 四、觸摸操作 ? 1.driver.tap([坐標],持續(xù)點擊時間) 除了定位到元素的點擊外,也可以通過tab實現(xiàn)坐標的點擊 driver.tap(driver.tap([(216,1776)],2)) ? 2.TouchAction(driver) TouchAction對象包含(tab)、press(短按)、move_to(滑動到某個坐標)等方法 ? 通過TouchAction對象,添加tap、move_to等操作,然后perform()執(zhí)行,可以實現(xiàn)解鎖屏幕等功能 ? 規(guī)范中的可用事件有: ?* 短按 (press)
?* 釋放 (release)
?* 移動到 (moveTo)
?* 點擊 (tap)
?* 等待 (wait)
?* 長按 (longPress)
?* 取消 (cancel)
?* 執(zhí)行 (perform) ? ? 例如:一個多次滑屏的例子: action=TouchAction(driver) action.press(x=220,y=700).move_to(x=840,?y=700).move_to(x=220,?y=1530).move_to(x=840,?y=1530).release().perform() 可以通過wait()等待操作 ? 3.MultiAction()//多點觸控 通過MultiAction().add()添加多個TouchAction操作,最后調(diào)用perform()一起執(zhí)行這些操作 action0 = TouchAction().tap(el) action1 = TouchAction().tap(el) MultiAction().add(action0).add(action1).perform() ? 4.driver.swipe(x1,?y1,?x2,?y2,duration) ? //從坐標(x1,x2)滑動到坐標(x2,y2),duration非必填項,滑動時間 (滑動的坐標不能超過屏幕的寬高) 可以通過【driver.get_window_size()】命令獲得窗口高和寬,結(jié)果為{'width': 1080, 'height': 1776} ? 一個鼠標向上下左右活動的例子如下: #獲得屏幕大小寬和高
def?getSize(driver):
? ? x?=?driver.get_window_size()['width']
? ? y?=?driver.get_window_size()['height']
? ? return?(x,?y)

#屏幕向上滑動
def?swipeUp(driver,t=1000):
? ? l?=?getSize(driver)
? ? x1?=?int(l[0]?*?0.5)? ? #x坐標
? ? y1?=?int(l[1]?*?0.75)? ?#起始y坐標
? ? y2?=?int(l[1]?*?0.25)? ?#終點y坐標
? ? driver.swipe(x1,?y1,?x1,?y2,t)

#屏幕向下滑動
def?swipeDown(driver,t=1000):
? ? l?=?getSize(driver)
? ? x1?=?int(l[0]?*?0.5)? #x坐標
? ? y1?=?int(l[1]?*?0.25)? ?#起始y坐標
? ? y2?=?int(l[1]?*?0.75)? ?#終點y坐標
? ? driver.swipe(x1,?y1,?x1,?y2,t)
#屏幕向左滑動
def?swipLeft(driver,t):
? ? l=getSize(driver)
? ? x1=int(l[0]*0.75)
? ? y1=int(l[1]*0.5)
? ? x2=int(l[0]*0.05)
? ? driver.swipe(x1,y1,x2,y1,t)
#屏幕向右滑動
def?swipRight(driver,t=1000):
? ? l=getSize(driver)
? ? x1=int(l[0]*0.05)
? ? y1=int(l[1]*0.5)
? ? x2=int(l[0]*0.75)
? ? driver.swipe(x1,y1,x2,y1,t) ? #調(diào)用向下滑動的方法 swipeDown(driver) ? ? 五、系統(tǒng)按鍵事件 ? ?press_keycode(AndroidKeyCode)//發(fā)送按鍵事件 例如:點擊home鍵,home鍵的KeyCode是3 driver.press_keycode(3) ? 鍵名? ? ? ? ? ? ? ? ? 描述? ? ? ?鍵值
KEYCODE_CALL? ? ? ? 撥號鍵? ? ?5
KEYCODE_ENDCALL? ? ?掛機鍵? ? ?6
KEYCODE_HOME? ? ? ? 按鍵Home? ? ? 3
KEYCODE_MENU? ? ? ? 菜單鍵? ? ?82
KEYCODE_BACK? ? ? ? 返回鍵? ? ?4
KEYCODE_SEARCH? ? ? 搜索鍵? ? ?84
KEYCODE_CAMERA? ? ? 拍照鍵? ? ?27
KEYCODE_FOCUS? ? ? ?拍照對焦鍵? ?80
KEYCODE_POWER? ? ? ?電源鍵? ? ?26
KEYCODE_NOTIFICATION?通知鍵? ? ? ? 83
KEYCODE_MUTE? ? ? ? 話筒靜音鍵? ?91
KEYCODE_VOLUME_MUTE?揚聲器靜音鍵? 164
KEYCODE_VOLUME_UP? ?音量增加鍵? ?24
KEYCODE_VOLUME_DOWN?音量減小鍵? ?25
更多KeyCode可以查看下面的博客: http://blog.csdn.net/crisschan/article/details/50419963 ? ? 六、driver的一些比較重要操作 ? 1.reset() //重置app 這時候driver會重置,相當于卸載重裝應(yīng)用。所以本地緩存會失效 driver.reset() ? 2.start_activity(包名,activity名) //啟動app的某一個activity 例如:driver.start_activity("com.wuba.zhuanzhuan","./presentation.view.activity.LaunchActivity") ? 啟動一個activity,這個activity必須是AndroidManifest.xml中有intent-filter的activity <intent-filter> ? ? <action android:name="android.intent.action.MAIN"/> ?? <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> ? 這種啟動activity和driver的reset()不同的是 ? 3.contexts //獲得所有contexts driver.contexts ? 結(jié)果如下: ['NATIVE_APP', 'WEBVIEW_com.android.browser'] ? NATIVE_APP:native的context WEBVIEW_com.android.browser:webview的context,存放html的容器 ? 4.current_context //查看當前的context driver.current_context ? 5.switch_to.context(context名) //切換context driver.switch_to.context("WEBVIEW_com.wuba.zhuanzhuan") ? NATIVE時不能定位WEBVIEW的內(nèi)容,在WEBVIEW的context時不能定位NATIVE的內(nèi)容。 所以需要切換到對應(yīng)的context中去進行操作 ? 6.setNetworkConnection(bitmask掩碼) //設(shè)置網(wǎng)絡(luò)類型 例如:設(shè)置網(wǎng)絡(luò)類型為只開wifi driver.set_network_connection(2) ? 網(wǎng)絡(luò)的bitmask掩碼如下: | 值 (別名)? ? ? ? ? ?| 數(shù)據(jù)連接 | Wifi 連接 | 飛行模式 | | ------------------ | ---- | ---- | ------------- | | 0 (什么都沒有)? ? ? ?| 0? ? | 0? ? | 0 | | 1 (飛行模式)? ? ? ? ?| 0? ? | 0? ? | 1 | | 2 (只有Wifi)? ? ? ? | 0? ? | 1? ? | 0 | | 4 (只有數(shù)據(jù)連接)? ? ?| 1? ? | 0? ? | 0 | | 6 (開啟所有網(wǎng)絡(luò))? ? ?| 1? ? | 1? ? | 0 | ? 7.scroll(起始元素,結(jié)束元素) driver.scroll(origin_el,destination_el) ? 8.獲得當前頁面的所有元素 driver.page_source ? 這可以用來判斷元素是否存在,例如assert?"發(fā)布成功"?in?driver.page_source) ? 9.補充一些driver啟動時可能用到的項 其實這些在上一篇啟動里都有介紹,但是有些可能大家沒注意到的點再列一下。這些點也是我在測試中實際遇到的點 ? autoLaunch :Appium是否要自動啟動或安裝app,默認true desired_caps['autoLaunch']?=?'false' 有的時候我不想讓appium每次都啟動app,想自己去啟動activity,那這個項這時就可以起作用了 ? noReset:在會話前是否重置app狀態(tài)。默認是false desired_caps['noReset']?=?'true' ? newCommandTimeout:設(shè)置未接收到新命令的超時時間,默認60s 如果60s內(nèi)沒有接收到新命令,appium會自動斷開連接,如果我需要很長時間做driver之外的操作,可能延長接收新命令的超時時間 desired_caps["newCommandTimeout"]=1800 ?

轉(zhuǎn)載于:https://www.cnblogs.com/botoo/p/7510006.html

總結(jié)

以上是生活随笔為你收集整理的appium===元素定位的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。