合肥阿裏巧巧信息科技有限公司

18955110833

自動化測試工(gōng)具——Selenium

2023-04-20 16:57 欄目: 技術學堂 查看()


1    selenium簡介

Selenium是一(yī)個用于We應用程序測試的工(gōng)具。是一(yī)個開(kāi)源的Web的自動化測試工(gōng)具,最初是爲網站自動化測試而開(kāi)發的,類型像我(wǒ)(wǒ)們玩遊戲用的按鍵精靈,可以按指定的命令自動操作,不同是Selenium可以直接運行在浏覽器上,它支持所有主流的浏覽器,支持的浏覽器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。

Selenium測試直接運行在浏覽器中(zhōng),就像真正的用戶在操作一(yī)樣。可以根據我(wǒ)(wǒ)們的指令,讓浏覽器自動加載頁面,獲取需要的數據,甚至頁面截屏,或者判斷網站上某些動作是否發生(shēng)。

  Slenium 自己不帶浏覽器,不支持浏覽器的功能,它需要與上面提到的第三方浏覽器結合在一(yī)起才能使用。但是我(wǒ)(wǒ)們有時候需要讓它内嵌在代碼中(zhōng)運行,所以我(wǒ)(wǒ)們可以用一(yī)個叫 PhantomJS 的工(gōng)具代替真實的浏覽器。

2    Selenium的幾個特點

1、開(kāi)源軟件:源代碼開(kāi)放(fàng)可以根據需要來增加工(gōng)具的某些功能

2、跨平台,多平台支持:linux 、windows 、mac

3、支持多浏覽器:Firefox、Internet Explorer、Safari、Opera、Chrome、Edge

4、核心功能:就是可以在多個浏覽器上進行自動化測試

5、可以搭配多種編程語言使用:Java、Python、C#、JavaScript、Ruby等

6、成熟穩定:目前已經被google , 百度, 騰訊等公司廣泛使用

7、支持分(fēn)布式測試用例的執行,可以把測試用例分(fēn)布到不同的測試機器的執行,相當于分(fēn)發機的功能。

8、功能強大(dà):能夠實現類似商(shāng)業工(gōng)具的大(dà)部分(fēn)功能,因爲開(kāi)源性,可實現定制化功能

3    Selenium的主要功能

selenium的主要功能包括:

測試與浏覽器的兼容性——測試你的應用程序看是否能夠很好得工(gōng)作在不同浏覽器和操作系統之上。

測試系統功能——創建回歸測試檢驗軟件功能和用戶需求。支持自動錄制動作和自動生(shēng)成 .Net、Java、Perl等不同語言的測試腳本。

4    selenium原理

我(wǒ)(wǒ)們使用Selenium實現自動化測試,主要需要3個東西

1.  測試腳本,可以是python,java編寫的腳本程序(也可以叫做client端)

2.  浏覽器驅動, 這個驅動是根據不同的浏覽器開(kāi)發的,不同的浏覽器使用不同的webdriver驅動程序且需要對應相應的浏覽器版本,比如:geckodriver.exe(chrome)

3.  浏覽器,目前selenium支持市)面上大(dà)多數浏覽器,如:火(huǒ)狐,谷歌,IE等

selenium腳本

    from selenium import webdriver

    driver = webdriver.Chrome()

執行上述代碼,我(wǒ)(wǒ)們會發現程序打開(kāi)了Chrome浏覽器(前提:你已經正确配置了Chrom驅動和對應的版本) 那麽 selenium 是如何實現這個過程呢?ok,那我(wǒ)(wǒ)們就來分(fēn)析一(yī)下(xià)selenium的工(gōng)作原理。

源碼分(fēn)析

如圖,按住Ctrl 建,點擊Chrome,我(wǒ)(wǒ)們可以看到webdriver的代碼\site-packages\selenium\webdriver\chrome\webdriver.py

image.png

通過源碼的第 68-73行,我(wǒ)(wǒ)們可以看到,他啓動了一(yī)個 service對象,然後調用了 sart() 方法,那麽我(wǒ)(wǒ)們繼續看一(yī)下(xià)第 73 行 start()方法具體(tǐ)做了什麽。

image.png

我(wǒ)(wǒ)們可以看到,第69-76行,他執行了一(yī)個cmd命令,這個命令主要是啓動了一(yī)個ChromeDriver.exe浏覽器驅動,我(wǒ)(wǒ)們每次在執行腳本前,程序會自動幫我(wǒ)(wǒ)們啓動浏覽器驅動,這個效果就跟我(wǒ)(wǒ)們自己手動啓動是一(yī)樣的效果。

第一(yī)步工(gōng)作我(wǒ)(wǒ)們已經知(zhī)道了執行腳本webdriver.Chrome()會自動執行 chromedirver.exe驅動程序,然後開(kāi)啓一(yī)個進程。

如何打開(kāi)浏覽器

我(wǒ)(wǒ)們繼續看源碼 \site-packages\selenium\webdriver\chrome\webdriver.py 的51-57行代碼,調用了父類RemoteWebDriver 的初始化方法,我(wǒ)(wǒ)們看這個方法做了什麽事?

這裏有一(yī)行最重要的代碼,62行self.start_session(capabilities, browser_profile) 這個方法,繼續看一(yī)下(xià)這個方法的源碼做了什麽工(gōng)作

image.png

分(fēn)析這部分(fēn)源碼可以發現22行是向地址localhost:9515/session發送了一(yī)個post請求,參數是json格式的,然後返回特定的響應信息給程序(這裏主要就是新建了一(yī)個sessionid),最終打開(kāi)了浏覽器,打開(kāi)浏覽器的操作完成了

如何執行對應操作 查看\site-packages\selenium\webdriver\chrome\webdriver.py源碼(第一(yī)個源碼中(zhōng)的76-81行)

image.png

點擊ChromeRemoteConnection查看一(yī)下(xià)源碼

第24行訪問的是localhost:9515/session地址,第25-28行,定義了一(yī)些和我(wǒ)(wǒ)們使用的浏覽器(chrome)特有的接口地址,我(wǒ)(wǒ)們再看一(yī)下(xià)父類RemoteConnection裏面源碼

image.png

這個類裏面定義了所有的selenium操作需要的接口地址(這些接口地址全部封裝在浏覽器驅動程序中(zhōng)),那麽所有的浏覽器操作就是通過訪問這些接口來實現的 其中(zhōng) Command.GET: (‘POST’, ‘/session/$sessionId/url’) 這個地址就是實現訪問一(yī)個網址的url ,我(wǒ)(wǒ)們先記錄一(yī)下(xià)後面有用。所有的操作對應接口地址我(wǒ)(wǒ)們知(zhī)道了,那麽又(yòu)怎樣執行這些接口來達到在浏覽器上實現各種操作呢?繼續看緊接着接口地址定義下(xià)面的源碼

image.png

可以看到主要是通過execute方法調用_request方法通過urilib3标準庫向服務器發送對應操作請求地址,進而實現了浏覽器各種操作。

有人會問打開(kāi)浏覽器和操作浏覽器實現各種動作是怎麽關聯的呢? 其實,打開(kāi)浏覽器也是發送請求,請求會返回一(yī)個sessionid,後面操作的各種接口地址,你也會發現接口地址中(zhōng)存在一(yī)個變量$sessionid,那麽不難猜測打開(kāi)浏覽器和操作浏覽器就是用過sessionid關聯到一(yī)起,達到在同一(yī)個浏覽器中(zhōng)做操作 第二步在浏覽其上實現各種操作原理也完成了

5    selenium的工(gōng)作過程

可能大(dà)家看原理的時候,會有些不理解,那麽我(wǒ)(wǒ)們可以看看selenium它是如何工(gōng)作的?

1.  selenium client(python等語言編寫的自動化測試腳本)初始化一(yī)個service服務,通過Webdriver啓動浏覽器驅動程序chromedriver.exe

2.  通過RemoteWebDriver向浏覽器驅動程序發送HTTP請求,浏覽器驅動程序解析請求,打開(kāi)浏覽器,并獲得sessionid,如果再次對浏覽器操作需攜帶此id

3.  打開(kāi)浏覽器,綁定特定的端口,把啓動後的浏覽器作爲webdriver的remote server

4.  打開(kāi)浏覽器後,所有的selenium的操作(訪問地址,查找元素等)均通過RemoteConnection鏈接到remote server,然後使用execute方法調用_request方法通過urlib3向remote server發送請求

5.  浏覽器通過請求的内容執行對應動作

6.  浏覽器再把執行的動作結果通過浏覽器驅動程序返回給測試腳本

 




掃二維碼與項目經理溝通

我(wǒ)(wǒ)們在微信上24小(xiǎo)時期待你的聲音

解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯網交流

鄭重申明:善達信息以外(wài)的任何單位或個人,不得使用該案例作爲工(gōng)作成功展示!