1.web 基礎-html、dom 物件、js 基本語法
Dom 物件裡面涉及元素定位以及對元素的修改。因為對元素操作當中涉及的一些 js 操作,js 基本語法要會用。得要掌握前端的基本用法。為什麼要元素定位?因為找到這個元素,就能告訴程式碼要找誰要做什麼。
2.元素定位
四大基本元素定位:id name class_name tag_name
針對連結:link_text
部分文字內容:partial_link_text
萬能定位方式:xpath css
常用的元素定位方式是:id xpath
css 選擇器的定位方式看起來比較複雜,和前端掛鉤,但是 css 能做的事,xpath 一樣能做。只要能解決問題就行。
動態 id,可以用別的屬性來定位。xpath 基本的定位原則是:相對路徑,相對路徑中基本的定位方式是//標籤名[@屬性名=值]
但是這種基本定位方式對我們來說不夠用,所以增加了邏輯運算://標籤名[@屬性名=值 and/or@屬性名=值 ]
以上是靠自身的屬性來定位,還可以靠文字內容來定位:通過文字匹配的方式,「目前 css 是不支援文字定位方式的。」 但是 xpath 可以定位:文字全匹配://標籤名[text()=文字值]
文字和屬性的部分匹配://標籤名[contains(text()/@屬性值,部分值)]
以上 3 種是根據自己的特質來匹配的。
如果靠自己的特質不行的話,可以通過:
1.層級定位:先定位到上級或者上上級,縮小範圍,再定位元素。
2.軸定位:找各種關係來定位。這種一般在表格當中比較多。軸定位的方式有這幾種:
ancestor:祖先
parent:父母(這裡主要指爸爸)
兄弟姐妹:
preceding-sibling
:選取當前節點之前的所有同級節點,同一個parent下該節點之前的節點,即“哥哥”節點(是同父的哥哥節點)。
following-sibling
:選取當前節點之後的所有同級節點。
在各種定位解決不了問題的情況下就可以用軸定位了。各種定位方式隨便組合,就能夠定位到你要的東西。
「定位原則:」
定位也非常影響指令碼的穩定性,如果定位做的不好,這個影響也是比較大的。
1.儘量不要使用絕對路徑和下標。
2.通過定位方式唯一匹配元素,匹配一個元素,而且確保這個元素就是你要找的。
3.選擇元素穩定的屬性。(這樣不至於元素一變動或者頁面的內容一變動,這個元素對應的東西也變了。可變的屬性不要作為元素定位手段)這個需要自己觀察了。
3.元素操作
「頁面最基本的 4 大操作(函式):」
send_keys
:輸入
click
:點選
text
:獲取文字值
get_attribute
:獲取屬性
在 APP 的 web 自動化中直接套用這 4 大操作。
針對特殊的元素做的一些處理:
「三種等待方式:」
sleep
:強制等待
implicity_wait
:隱形等待
WebdriverWait和expected_condition
:顯示等待
在實際工作過程當中,sleep
會和WebdriverWait和expected_condition
結合起來用。
sleep
僅僅作為輔助作用,WebdriverWait
和條件組合起來能夠找到元素,但是在執行的時候會告訴我,這個元素還沒有出現,這種情況下不用覺得它沒有用。「再借助sleep
0.5 秒或者 1 秒都可以。」 給頁面一個緩衝的時間,雖然它可能找到了,但是可能頁面渲染還沒有成功。
sleep
不應該睡眠太久,這樣很浪費時間。WebdriverWait
這個顯性等待是我們用的最多的。WebdriverWait
是一個類,它處理的是我們的等待。它有一個等待上限。
「顯性等待的用法:」
WebdriverWait(driver,timeout,0.5 ).until/until_not
會話物件 超時時長(最多能等多久,隔多久看一眼) 預設是 0.5,可以改成別的數字
WebdriverWait
有 2 個函式until/until_not
,一個是直到條件滿足,一個是直到條件不滿足。
「怎麼表達條件?」
條件就用expected_condition 期望的條件
。可以用它來作為條件表達,條件表達最常用的就是元素可見。關於它的傳參,是一個元組等等。visibility_of_element_located((元素定位型別,元素定位表示式))
還有元素存在,元素可點選等等。
「三種切換:」
三種切換都用到了等待。
iframe切換、window切換、alert彈框
都有一個顯性等待。
iframe切換
是一定要有iframe
才需要切換。一定要確保你的元素確實是在iframe
裡面。至於如何確認的,請回看文章《三種切換》。
iframe
本質上也是一個元素,只不過它的標籤名叫做iframe
。但是它裡面放的是個 web 頁面。
APP 自動化中就有這樣的情況,外面是一個安卓的控制元件元素,但是控制元件裡面放的是 web 網頁。這裡也是一樣的意思。iframe
是外面的主頁的一個元素控制元件。跟它裡面放的是一個 html 頁面含義是一樣的。
在 App 自動化中 h5 的混合應用,也就是 web 網頁和安卓原生控制元件混在一個頁面中的時候,也要涉及切換,道理和iframe
一樣的。結合了iframe
和windows
。
「iframe切換可以根據哪些屬性?」
name 下標 表示式 WebElement物件
以上這些都可以切換進去的。切換是這樣做的:在我們 selenium Webdriver
當中切換是統一的driver.switch_to.frame/window/alert
。
APP 自動化中也是driver.switch_to
。這個東西是通用的,只是後面跟的名字不一樣。
「windows 的處理流程是:」
要獲取當前所有的window_handle(driver.window_handle)
得到的是一個列表。最後一個是最新開啟的視窗。是根據它的控制程式碼,也就是根據列表當中的位置去切換的。自己要清楚它在哪個位置。
「alert
彈框」
只有處理了alert
才能對頁面進行操作。一個瀏覽器當前直接只能有一個alert
。它是一個alert
類來處理的。alert
當中有accetp\dissmis
來表示接收和拒絕。
「滑鼠/鍵盤操作」
滑鼠:ActionChains類:
這個類裡面分為 2 種操作型別:
將所有的操作雙擊、點選、拖拽、右鍵這樣的東西都是放在一個列表當中。
1.滑鼠行為函式(move_to_element、懸浮元素的定位)。
2.perform()函式是用來執行滑鼠操作的。
能不用滑鼠就不用滑鼠,如果有其它的按鍵操作就代替滑鼠操作,因為滑鼠操作不穩定。
APP 自動化中有一個東西的套路和ActionChains
的套路是一樣的。Web 自動化的基本東西和框架掌握了,那麼 APP 自動化就沒有什麼難度。
「鍵盤操作」:send_keys(Keys)
send_keys(Keys類)
本來就是用來傳送資料的。1,2,3...等這樣的簡單數字就用send_keys()
發就可以。
沒必要用到 Keys 類。當你用到組合鍵的時候,就可以用 Keys 類。其它情況下,沒事不用它。
「下拉選單:」
Select\option
-Select
類來處理。
Select
類來處理,有哪 3 種選擇的方式?例項化的時候傳什麼樣的物件?
例項化類的時候,初始化引數是Select
元素。
「列表選值的 3 種方式:」
index/value/visible_text
value
是value
屬性。index
是它在這個列表中所處的位置,從 0 開始。visible_text
是指它的文字內容。
有哪個用哪個,如果value/visible_text
沒有,那麼index
是肯定可以用的。根據實際情況而定。
以上這些是特別的處理,其它的下拉選單,例如通過 div 實現的,等到下拉選單出現再去處理。像這種是不需要等到下拉選單出現的,直接省了這個步驟,也不需要你去點一下讓它出現。
「js-滾動條:」
APP 其實也有滾動條的,但是做法有點點區別。滾動條是執行 js 語句。driver.execute_script(js語句,引數)
這個引數可以傳很多個。這個引數是給 js 語句用的。
Arguments[0]scrollintoView()
傳參 滾動到可見區域
預設是 True,與上邊對齊。改成 False,是與下邊對齊。
Arguments[0]
0 來自於這個driver.execute_script(js語句,引數)
執行語句中的引數,是第一個引數。如果是第二個,就是Arguments[1]
。
「由引數的個數決定Arguments
裡面的下標值到底是幾。」
至於滾動到頁面底部和滾動到頁面頂部,用scrollintoView()
。
另外一個 js 中的語法也可以做這個事情:scrollintoViewifneeded()
並不是一定要處理滾動條,看系統。如果框架實現了截圖,截圖裡也看不到,元素是可見的但是提示你不可見,那就需要你將它滾動到可見區域。很多情況下是不需要將它滾動到可見區域的。
「js-日期:」
如果不好做這塊的自動化就不要做了,就手點了。
日期輸入框readonly
屬性。
也有可以編輯的時候,如果可以編輯就按照系統規定的格式輸入。如果是不可以輸入的,移除readonly
屬性,或者將它設定為 False。
「檔案上傳:」
autoit
需要學習成本。在 mac 或者 linux 下面,用autoit
。
pywin32
:專門針對 windows 做的檔案上傳。這塊的程式碼在《利用 pywin32 庫上傳檔案》一文裡,你們直接拷貝就可以,不需要自己再寫一遍了,明白你需要改的地方是什麼就可以了,有需要的自取。
4.Selenium 執行原理
以命令的形式定義好了內部 http 通訊協議。所有的命令都定義好了,所有的函式基本操作都是通過傳送命令來實現的。詳情請回看《元素定位和元素定位輔助工具》一文。
對原理有進一步的認知是比較好的。要成為一個會研究的人而不是隻會用的人,所以多看原始碼。
5.專案實戰+框架
1.業務瞭解,需求瞭解。(如果公司讓你寫一份自動化測試計劃,這個就是整個自動化測試計劃的一部分。前期就是要花時間瞭解業務的。)詳細的請回看《做自動化之前的準備工作》一文。
2.測試用例的實現、篩選(多和團隊人員交流,瞭解全方位的資訊)、用例評審。
3.框架、大概用多少時間實現自動化測試用例、持續整合jenkins、優化和除錯、提高用例通過率(通過率至少80%)、哪些是冒煙用例(什麼時候/執行時長)、SIT/預生產、郵件通知。
4.維護階段(分析測試報告--哪些是bug、哪些是你程式碼的bug、哪些是環境問題)
5.彙報。
在前期就應該明白哪些是冒煙用例,實現用例可能兩個月,後期的除錯需要半個月,除錯是需要時間的,也不簡單。什麼時候冒煙,什麼時候迴歸,每週執行多少次,週末要不要執行等這些執行策略,在最開始做的時候自己就要非常清楚的。
「框架:」
PO 模式:PageObjects(頁面操作、元素定位)、TestCase(業務流程)、測試用例和測試物件分離。
進一步分層:PageLocators(頁面元素定位)、TestDatas(測試資料的分離)
Common
:basepage
:封裝基本函式、異常處理、失敗截圖、日誌。
Outputs
:Logs、Screenshots、Reports
pytest
框架:mark、引數化、fixture/conftest.py、重執行(reruns)、html測試報告、allure測試報告、xml測試報告(定製化)
pytest 的 html 測試報告當中是可以插入自動化截圖的,既然用了 Allure 就不需要這個功能了。
6.問題整理
Jenkins 中可以關聯工程的執行順序的。可以設定當前工程執行成功之後再去執行下一個工程。
「pytest 裡面有個 skip 是什麼?」
unittest
也有 skip
。是指這個用例不想執行的話就跳過去。
「執行機和本機不能是同一臺電腦。」
ps:假如領導讓處理你不熟悉的領域的事,不要猶豫,趕緊去做。有什麼不懂得可以多和上司溝通,自己不需要做決策,可以提供方案讓領導來選擇。遇事不退縮,勇敢面對。
公眾號 「「清菡軟體測試」首發,更多原創文章:清菡軟體測試 78+原創文章,歡迎關注、交流,禁止第三方擅自轉載。