Web自動化必會知識:「Web基礎、元素定位、元素操作、Selenium運行原理、項目實戰+框架」

  • 2020 年 8 月 23 日
  • 筆記

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/[email protected]屬性名=值 ]

以上是靠自身的屬性來定位,還可以靠文本內容來定位:通過文本匹配的方式,「目前 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和條件組合起來能夠找到元素,但是在運行的時候會告訴我,這個元素還沒有出現,這種情況下不用覺得它沒有用。「再藉助sleep0.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 自動化中就有這樣的情況,外面是一個Android的控制項元素,但是控制項裡面放的是 web 網頁。這裡也是一樣的意思。iframe是外面的主頁的一個元素控制項。跟它裡面放的是一個 html 頁面含義是一樣的。

在 App 自動化中 h5 的混合應用,也就是 web 網頁和Android原生控制項混在一個頁面中的時候,也要涉及切換,道理和iframe一樣的。結合了iframewindows

「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\optionSelect類來處理。

Select類來處理,有哪 3 種選擇的方式?實例化的時候傳什麼樣的對象?

實例化類的時候,初始化參數是Select元素。

「列表選值的 3 種方式:」

index/value/visible_text

valuevalue屬性。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+原創文章,歡迎關注、交流,禁止第三方擅自轉載。