自動化面試常問問題


1.怎么判斷元素是否存在?
判斷元素是否存在和是否出現不同, 判斷是否存在意味着如果這個元素壓根就不存在, 就會拋出NoSuchElementException
這樣就可以使用try catch,如果catch到NoSuchElementException 就返回false。通常在項目中會把這個功能封裝在isElementPresent方法中。
2.如何判斷元素是否出現?
判斷元素是否出現,存在兩種情況,一種是該元素壓根就沒有,自然不會出現;另外一種是有這樣的元素,但是是hidden狀態
可以通過先判斷是否存在,如果不存在返回false;如果存在再去判斷是否displayed。
5. 如何去定位頁面上動態加載的元素?
    觸發動態事件,然后findElemnt
    如果是動態菜單,需要一級一級find(JS實現)
6.如何去定位屬性動態變化的元素?
  屬性動態變化是指該element沒有固定的屬性值,所以只能通過相對位置定位
    比如通過xpath的軸, parent/following-sibling/precent-sibling等
    另外也可以嘗試findbyelements遍歷
8.自動化測試的時候是否需要連接數據庫做數據校驗?
一般來說1、 UI自動化不需要(很少需要);2、接口測試會需要:從數據庫層面來進行數據校驗可以更方便驗證系統的數據處理方面是否正確;
9.有幾種元素常用定位方式,分別是?你最偏愛哪一種,為什么?
8種:id、name、class name、tag name、link text、partial link text、xpath、css selector 偏愛哪一種?答:
我最常用的是xpath(或CssSelector)因為很多情況下,html標簽的屬性不夠規范,無法通過單一的屬性定位,這個時候就只能使用xpath可以去重實現定位唯一element
事實上定位最快的是Id,因為id是唯一的,然而大多數開發並沒有設置id。
10.怎么提高selenium腳本的自動化執行效率?
1.優化測試用例,盡可不使用 sleep,減少使用ImplicitlyWait
2.多使用selenium的WebDriverWait/FluentWait,這樣可以優化等待時間
3.減少不必要的操作步驟,如經過三四步才能打開我們要測試的頁面的話,我們就可以直接通過網址來打開,減少不必要的操作。
4.中斷頁面加載,如果頁面加載的內容過多,我們可以查看一下加載慢的原因,如果加載的內容不影響我們測試,就設置超時時間,中斷頁面加載。
5.使用性能好的電腦
11.用例在運行過程中經常會出現不穩定的情況,也就是這次可以通過,下次無法通過了,如何提高用例的穩定性?
1,查找元素前先做判斷:ExpectedConditions里面的各種方法;
2,顯式等待:多使用WebDriverWait,加上顯式等待時間,等要操作的元素出現之后再執行下面的操作;
3、多用try catch捕獲異常;
4,多線程的時候,減少測試用例耦合度,因為多線程的執行順序是不受控制的;
5,盡量使用測試專用環境,避免其他類型的測試同時進行,對數據造成干擾。
12.你的自動化用例的執行策略是什么?
1.自動化測試用例是用來監控的。集成到jenkins,創建定時任務定時執行;
2.有些用例在產品上線前必須回歸。jenkins上將任務綁定到開發的build任務上,觸發執行;
3.有些用例不需要經常執行。jenkins創建一個任務,需要執行的時候人工構建即可。
13.什么是持續集成?
頻繁的將代碼集成到主干,持續性的進行項目的構架,以便能能夠快速發現錯誤,防止分支大幅度偏離主干
14.webdriver client的原理是什么?
在selenium啟動以后,driver充當了服務器的角色,跟client和瀏覽器通信,client根據webdriver協議發送請求給driver。driver解析請求,並在瀏覽器上執行相應的操作,並把執行結果返回給client.
15.webdriver的協議是什么?
The Wire Protocol
16.啟動瀏覽器的時候用到的是哪個webdriver協議?
http
18.怎樣去選擇一個下拉框中的value=xx的option?
1.select類里面提供的方法:selectByValue(“xxx”)
2.xpath的語法也可以定位到
 
9 Appium 與 Selenium的關系
selenium是web端的自動化,appium是app端的自動化,appium繼承了webdriver(也就是selenium 2)
 
10 appium原理(加載流程)
調用Andorid adb完成基本的系統操作
2)向Andriod上部署bootstrap.jar包並啟動
3)Forward Android 的端口到PC的機器上
4)PC上監聽端口接受請求,使用webdriver協議
5)分析命令並轉通過forward的端口發給bootstrap.jar包
6)bootstrap接受請求並把命令發給UiAutomator或插樁體系
 
 
 
 
 
一、Appium adb命令和問題
1、手機和電腦連接,打開手機的開發者模式打開USB調試
 
2、CMD中查看手機UDID:
adb devices
 
3、CMD啟動appium服務:
appium -a 127.0.0.1 -p 4723 –U 手機的UDID --no-reset
 
3、CMD中查看安卓版本號:
adb shell getprop ro.build.version.release
 
4、獲取apppackage和appactivite
Ⅰ 通過打印日志獲取:通過CMD(管理員運行)adb logcat>C:\log.txt;點擊真機或者模擬器中的應用后,按ctrl+c終止會生成的log日志;在日志中查找 Displayed定位元素
Ⅱ 通過CMD獲取:打開應用后輸入:adb shell dumpsys activity | findstr "mFocusedActivity 或者 adb shell dumpsys window w |findstr / |findstr name=
 
5、解決代碼完善運行后,程序無響應問題
Ⅰ 直接CMD輸入命令 adb shell 進入手機
Ⅱ 進入手機之后,進入cd data/local/tmp
III 進入data/local/tmp 后輸入 ls 查看全部目錄,應該有一個AppiumBootstrap.jar,可能你的名字是AppiumBoots或者AppiumBootstrap.j
Ⅳ 輸入 mv 加上查到的文件名 AppiumBootstrap.jar 命令解決,將你的文件名改為 AppiumBootstrap.jar
 
6、uiautomat程序元素定位報錯:
打開CMD輸入 adb kill-server 然后輸入 adb start-server
 
二、Appium基礎API
1、連接手機前置代碼,缺一不可
from appium import webdriver
desired_caps = {}
desired_caps[‘platformName’] = ‘Android’ # 系統
desired_caps[‘platformVersion’] = ‘5.1’ # 系統版本號
desired_caps[‘deviceName’] = ‘8681-M02-0x14074b65’ # 手機UDID
desired_caps[‘appPackage’] = ‘com.android.settings’ # 應用包名、啟動名
desired_caps[‘appActivity’] = ‘.Settings’
 
解決中文不能輸入問題
desired_caps[‘unicodeKeyboard’] = True
desired_caps[‘resetKeyboard’] = True
 
聲明driver對象
driver = webdriver.Remote(‘http://localhost:4723/wd/hub’, desired_caps)
 
2、獲取包名啟動名
current_XXXXX
 
3、啟動其他程序
driver.start_activity(’ com.android.mms’,’.ui.ConversationList’)
 
4、置於后台
backround_app(秒)
 
5、定位元素
又分為id、class、xpath
其中,element獲取到的是一個元素,如果有相同的特征獲取到的是第一個
其中,element獲取到的是一個列表,如果想用其中的元素,需要通過下標的形式
ele = driver.find_element_by_id(‘miui:id/arrow_right’) id 定位
black_buttion = driver.find_element_by_xpath("//*[contains(@text,‘canshuID’)]") xpath 模糊定位
black_buttion = driver.find_element_by_class_name(‘android.widget.ImageView’)fing_elements class 定位
 
6、顯示等待
ele = WebDriverWait(driver,超時時間,頻率) # 每10s查找1次
導入工具包:from selenium.webdriver.support.wait import WebDriverWait
如果找到元素返回,否則會報超時錯誤
 
7、元素的操作
以下操作都是使用某個元素調用某個函數/屬性(不是driver)
點擊:click()
輸入文字:send_keys(’’)
清空:clear
定時時間:time.sleep(秒) 導入工具包 import time
獲取元素的文本內容:元素.text
獲取元素的屬性值:元素.attr
獲取元素的坐標:元素.location (元素左上角到屏幕右上角的內容)
 
三、Appium的滑動和拖拽
1、獲取時間戳
含義:從1970到現在過了多少秒
print(time.time())
導入工具包:import.time
 
2、swipe坐標滑動
從一個坐標位置滑動到另一個坐標位置,只能是兩個點之間的滑動
swipe是通過driver使用的
傳入起始的位置X和Y 和 結束的位置X和Y;時間參數越長滑動的越精准
s wipe(self,start_x: int,start_y: int,end_x: int,end_y: int,滑動時間)
driver.swipe(100,100,100.100,3000)
 
3、scroll元素滑動
從一個元素滑動到另一個元素,直到頁面靜止
方法:scroll(origin_el,destination_el)
參數:origin_el:滑動開始的元素 destination_el:滑動結束的元素
代碼:
el1 = driver.find_element_by_xpath("//[contains(@text,‘存儲’)]")
el2 = driver.find_element_by_xpath("//[contains(@text,‘藍牙’)]")
driver.scroll(el1,el2)
 
4、drag拖拽
從一個元素滑動到另一個元素,第二個元素代替第一個元素原本屏幕上的位置
方法:drag_and_drop(origin_el,destination_el)
代碼:
el1 = driver.find_element_by_xpath("//[contains(@text,‘存儲’)]")
el2 = driver.find_element_by_xpath("//[contains(@text,‘藍牙’)]")
driver.drag_and_drop(el1,el2)
driver.drag_and_drop(el1,el2) #會記錄原來的位置,划三次屏
driver.drag_and_drop(el1,el2)
 
scroll和drag的區別 drag沒有慣性
相同點:都是使用元素進行傳參;當swipe的時間足夠長的時候,和drag的效果相同
 
四、高級手勢TouchAction (導入模塊import…)
主要針對手勢的操作,比如滑動、長按、拖動等
所有手勢都要通過perform()函數才會運行
 
1、手指輕敲操作
模擬手指輕敲一下屏幕操作
方法:tap(element=None,x=None,y=None)
perform() # 發送命令到服務器執行操作
參數:1、element:被定位到的元素
2、x:相當於元素左上角的坐標,通常會使用元素的x軸坐標
3、y:通常會使用元素的Y軸坐標
代碼:
1、通過元素定位方式敲擊屏幕
el = driver.find_element_by_xpath("//*[contains(@text,‘存儲’)]")
TouchAction(driver).tap(el).perform()
2、通過坐標方式敲擊屏幕
TouchAction(driver).tap(x=155,y=250).perform()
 
2、手指按下和抬起
模擬手指按下屏幕和離開
方法:press(el=None,x=None,y=None)
release() # 結束動作,手指離開屏幕
參數:1、element:被定為到的元素
2、x:相當於元素左上角的坐標,通常會使用元素的x軸坐標
3、y:通常會使用元素的Y軸坐標
代碼:
1、通過元素定位方式敲擊屏幕
el = driver.find_element_by_xpath("//*[contains(@text,‘存儲’)]")
TouchAction(driver).press(el).release().perform()
2、通過坐標方式按下屏幕
TouchAction(driver).press(x=155,y=250).release().perform()
3、等待時間
TouchAction(driver).press(x=155,y=250).wait().release().perform()
 
4、手指長按操作
模擬手機按下屏幕一段時間和離開
方法:long_press(el=None,x=None,y=None,duration=1000)
參數:1、element:被定為到的元素
2、x:相當於元素左上角的坐標,通常會使用元素的x軸坐標
3、y:通常會使用元素的Y軸坐標
4、duration:持續時間,默認為1000ms
代碼:
button = driver.find_element_by_xpath("//*[contains(@text,‘WLAN’)]")
button.click()
el = driver.find_element_by_id(‘android:id/title’)
TouchAction(driver).long_press(el,duration=1000).release().perform()
 
5、手指移動操作
模擬手指滑動操作
方法:move_to(el=None,x=155,y=250)
參數:1、element:被定為到的元素
2、x:相對於前一個元素的X軸偏移量
3、y:相對於前一個元素的Y軸偏移量
代碼:
el = driver.find_element_by_xpath("//[contains(@text,‘存儲’)]")
el1 = driver.find_element_by_xpath("//[contains(@text,‘更多’)]")
TouchAction(driver).press(x=240,y=600).wait(100).move_to(x=100,y=100).release().perform()
 
五、手機操作API
1、獲取時間
方法:device_time
代碼:print(driver.device_time)
 
2、獲取手機的寬高
獲取手機的高度,可以根據寬高做一些坐標操作
方法:get_window_size()
代碼:print(driver.get_window_size())
 
3、發送鍵到設備 (可參照百度Android keycode)
模擬系統鍵值的操作,比如操作home鍵,音量鍵,返回鍵等
方法:keyevent(keycode,metastatate=None):
press_keycode(keycode,metastatate=None):
參數:1、keycode:發送給設備的關鍵代碼
2、metastatate:關於被發送的關鍵代碼的源信息,一般為默認值
代碼:
for i in range(3)
driver.keyevent(24) 24為+ 25為-
 
4、操作手機通知欄
打開手機的通知蘭,可以獲取通知欄的相關信息和元素操作
方法:open_notifications()
代碼:driver.open_notifications()
 
5、獲取手機當前網絡
獲取手機當前連接網絡
方法:network_connection
代碼:print(driver.network_connection)
 
6、設置手機網絡
更改手機網絡模式,模擬特殊網絡情況下的測試用例
方法:set_network_connection(connectionType)
參數:1、connectionType:需要被設備成為的網絡類型
代碼:
driver.set_network_connection(1)
 
7、手機截圖
截取手機當前屏幕,保存指定格式圖片到指定位置
方法:get_screenshot_at_file(filename)
參數:filename:制定路徑下,制定格式的圖片
代碼:
import os
driver.get_screenshot_as_file(’./XXXX.png’)
 


免責聲明!

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



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