?Selenium自動(dòng)化測(cè)試的主要目的是為了取代和加快手動(dòng)測(cè)試的進(jìn)程。為了顯著提高測(cè)試執(zhí)行的速度,我們可以選擇使用不同類(lèi)型的等待、Web定位器(Locator)、瀏覽器偏好,來(lái)優(yōu)化并提升Selenium測(cè)試的基礎(chǔ)設(shè)施。
下面,我們將主要從速度和性能兩個(gè)方面,向您介紹Selenium Web測(cè)試各項(xiàng)優(yōu)秀實(shí)踐,以便您能夠更好地加快測(cè)試并獲取測(cè)試結(jié)果。
加速Selenium測(cè)試的優(yōu)秀實(shí)踐
隨著軟件產(chǎn)品的持續(xù)更新,維護(hù)和升級(jí)Selenium測(cè)試的過(guò)程會(huì)變得越來(lái)越復(fù)雜。不過(guò),無(wú)論被測(cè)場(chǎng)景如何不同,下面有關(guān)Selenium的基本測(cè)試步驟都是相似的:
- 使用本地或遠(yuǎn)程的Selenium WebDriver去打開(kāi)被測(cè)的URL。
- 使用諸如XPath、CssSelector、以及Linktext等恰當(dāng)?shù)腤ebSelenium定位器,來(lái)定位所需的各種WebElement。
- 對(duì)已定位的WebElement執(zhí)行各項(xiàng)必要的操作,并測(cè)試頁(yè)面上的斷言。
- 釋放WebDriver所使用的資源。
盡管Selenium測(cè)試的效率在很大程度上,取決于測(cè)試的方法和內(nèi)部結(jié)構(gòu),但是我們可以總結(jié)出如下加快執(zhí)行Selenium測(cè)試用例的各種優(yōu)秀實(shí)踐:
選擇合適的Web定位器
Selenium中的Web定位器往往被認(rèn)為是任何測(cè)試場(chǎng)景的基本構(gòu)建塊。為了自動(dòng)化與任何Web元素的交互,我們首先應(yīng)該選對(duì)可定位WebElement的Web定位器,然后再對(duì)相應(yīng)的元素執(zhí)行適當(dāng)?shù)牟僮鳌F渲?,XPath、CSS Selector、Name、LinkText、Partial LinkText、TagName、以及ClassName都是在Selenium中被廣泛使用的Web定位器。我們通??梢詫⑵渑cfind_element或find_elements方法一起使用。
那么,究竟哪一款Web定位器在Selenium中能夠最快地定位到元素呢?其實(shí),ID才是最快的Web定位器,畢竟Selenium WebDriver中的ID定位器,對(duì)于頁(yè)面上的每個(gè)元素來(lái)說(shuō)都是唯一的。ID定位器可以返回與指定值(或字符串)相匹配的WebElement。如果頁(yè)面上存在多個(gè)具有相同ID的元素,那么document.getElementById()將返回第一個(gè)匹配的元素。主流Web瀏覽器都優(yōu)化了document.getElementById()方法,因此我們能夠以更快的速度,從DOM處提供WebElement。
如果WebElement并沒(méi)有ID屬性,那么請(qǐng)使用NAME屬性。而如果WebElement既沒(méi)有ID、又沒(méi)有NAME屬性,那就應(yīng)該使用CSS選擇器(Selector)的Web定位器。CSS引擎在所有主流瀏覽器中都是一致的,并且能夠通過(guò)Selenium中的CSS選擇器,來(lái)調(diào)優(yōu)它們的性能,以提供更快的元素識(shí)別和更少的測(cè)試執(zhí)行時(shí)間。因此,您在使用此類(lèi)特定的Web定位器時(shí),也會(huì)鮮少遇到瀏覽器的兼容性問(wèn)題。同時(shí),CSS選擇器也能適應(yīng)IE等老舊的瀏覽器。
此外,與XPath相比,CSS選擇器提供了更好的可讀性。我們甚至可以說(shuō),XPath是最慢的Web定位器,當(dāng)您從一個(gè)瀏覽器移至另一個(gè)瀏覽器時(shí),很可能會(huì)遇到XPath的一致性問(wèn)題。因此,僅當(dāng)您無(wú)法在Selenium WebDriver中選用其他可靠的Web定位器時(shí),才建議使用XPath來(lái)定位Web元素。
小結(jié)一下,上述Web定位器按照?qǐng)?zhí)行速度從快到慢依次是:ID、NAME、CSS選擇器、以及XPath。
使用更少的Web定位器
既然您已經(jīng)確定了最適合加速Selenium測(cè)試的Web定位器,下一步就應(yīng)該將定位器的數(shù)量保持在最低限度了。
如前所述,我們每次需要使用find_element(By)或find_elements(By)方法,來(lái)定位所需的Web元素,以執(zhí)行對(duì)DOM樹(shù)的訪問(wèn)。那么對(duì)DOM樹(shù)的訪問(wèn)次數(shù)越多,Selenium腳本的執(zhí)行時(shí)間就會(huì)越長(zhǎng)。因此,如果您以Selenium腳本的最佳執(zhí)行速度為目標(biāo)的話,有必要使用更少的Web定位器。這樣,我們不但能夠提高測(cè)試腳本的可讀性,還可以最大限度地減少維護(hù)腳本所需的時(shí)間。
盡量避免Thread.sleep()
現(xiàn)代網(wǎng)站與Web應(yīng)用往往會(huì)?使用AJAX(異步的JavaScript和XML)在網(wǎng)頁(yè)上動(dòng)態(tài)加載內(nèi)容。因此,頁(yè)面上的WebElement可能會(huì)以不同的時(shí)間間隔被加載,這將對(duì)尚未處于DOM中的元素造成執(zhí)行上的困難。
在此,我建議您通過(guò)監(jiān)控document.readyState的狀態(tài),來(lái)檢查DOM狀態(tài)。document.readyState的完成標(biāo)志著頁(yè)面上的所有資源都已加載完畢,因此我們可以開(kāi)始對(duì)頁(yè)面上存在的WebElement進(jìn)行相關(guān)操作。
由于測(cè)試代碼中的幾秒鐘等待,都會(huì)增加頁(yè)面上資源加載所需的延遲,因此我們需要盡量避免使用Thread.sleep(sleep_in_miliseconds)。Selenium中的Thread.sleep()方法將會(huì)讓代碼的執(zhí)行暫停指定的時(shí)間間隔。
/* Pauses test execution for specified time in milliseconds */
Thread.sleep(5000);
如上述代碼段所示,我們添加了5秒的等待時(shí)間。如果頁(yè)面元素在指定的持續(xù)時(shí)間之內(nèi)(例如2秒鐘)就已完成了加載,那么剩下3秒的等待就不必要地增加了測(cè)試的執(zhí)行時(shí)間。由于頁(yè)面的加載時(shí)間往往取決于諸如:服務(wù)器負(fù)載、頁(yè)面設(shè)計(jì)、緩存、以及網(wǎng)絡(luò)帶寬等各種外部參數(shù),因此我們無(wú)法預(yù)測(cè)頁(yè)面的加載時(shí)間??梢?jiàn),無(wú)論網(wǎng)頁(yè)的狀態(tài)如何,Thread.sleep()方法都會(huì)執(zhí)行固定時(shí)間的休眠,因此為了加速Selenium測(cè)試,我們需要避免使用它。
重用現(xiàn)有的瀏覽器實(shí)例
目前,能夠與Selenium一起使用的所有自動(dòng)化測(cè)試框架,都可以通過(guò)提供注釋,來(lái)加快測(cè)試的開(kāi)發(fā)和執(zhí)行。同時(shí),注釋還有助于執(zhí)行具有不同輸入值的測(cè)試。當(dāng)然,只有根據(jù)測(cè)試的要求,使用正確的注釋集,才能加快Selenium測(cè)試。
以下是被各個(gè)主流自動(dòng)化測(cè)試框架所廣泛使用的注釋列表:
自動(dòng)化測(cè)試框架 | 注釋 |
JUnit [Selenium Java] | @BeforeClass, @Before, @Test, @After, @AfterClass, @Ignore |
TestNG [Selenium Java] | @BeforeSuite, @BeforeTest, @BeforeClass, @BeforeMethod, @Test, @AfterMethod, @AfterClass, @AfterTest, etc. |
NUnit [Selenium C#] | [SetUp], [TearDown], [Test], [TestCase], [OneTimeSetUp], [OneTimeTearDown], [Ignore], [Category], etc. |
XUnit [Selenium C#] | [Theory], [InlineData], [Fact], etc. |
有時(shí)候,您可能需要在相同的瀏覽器和操作系統(tǒng)類(lèi)型的組合中,反復(fù)運(yùn)行某個(gè)或某組測(cè)試。此時(shí),如果您在每個(gè)測(cè)試的開(kāi)始時(shí),都創(chuàng)建一個(gè)新的Selenium WebDriver實(shí)例,顯然會(huì)增加測(cè)試執(zhí)行的額外開(kāi)銷(xiāo)。
Selenium的JUnit
下面是Selenium的JUnit中注解的執(zhí)行順序:
在使用JUnit框架的Selenium自動(dòng)化測(cè)試中,Selenium WebDriver實(shí)例是在@Before注釋下實(shí)現(xiàn)的SetUp方法中創(chuàng)建的。已創(chuàng)建的實(shí)例是在@After注解下實(shí)現(xiàn)的TearDown方法中被銷(xiāo)毀的。
Selenium的TestNG
下面是Selenium的TestNG中注解的執(zhí)行順序:
同理,對(duì)于Selenium中的TestNG測(cè)試,SetUp方法是在@BeforeMethod注解下實(shí)現(xiàn)的,而TearDown方法是在@AfterMethod注解下實(shí)現(xiàn)的。
在瀏覽器和操作系統(tǒng)的組合上運(yùn)行一系列測(cè)試
下面,我們來(lái)討論不同的框架在同一個(gè)瀏覽器和操作系統(tǒng)組合上執(zhí)行三個(gè)測(cè)試的情況:
JUnit 框架
測(cè)試 - 1 @Before 注解下的 setUp() -> Test-1 -> @After 注解下的 tearDown()
測(cè)試 - 2 @Before 注解下的 setUp() -> Test-2 -> @After 注解下的 tearDown()
測(cè)試 - 3 @Before 注解下的 setUp() -> Test-3 -> @After 注解下的 tearDown()
TestNG 框架
測(cè)試 - 1 @BeforeMethod 注解下的 setUp() -> Test-1 -> @AfterMethod 注解下的 tearDown()
測(cè)試 - 2 @BeforeMethod 注解下的 setUp() -> Test-2 -> @AfterMethod 注解下的 tearDown()
測(cè)試 - 3 @BeforeMethod 注解下的 setUp() -> Test-3 -> @AfterMethod 注解下的 tearDown()
如上表所示,在每個(gè)測(cè)試場(chǎng)景都會(huì)在注釋之后創(chuàng)建和銷(xiāo)毀瀏覽器實(shí)例。
在JUnit和TestNG框架中重用瀏覽器實(shí)例
相反,我們可以使用適當(dāng)?shù)淖⑨屧谀_本之間共享相同的瀏覽器實(shí)例:
JUnit 框架
測(cè)試 - 1、測(cè)試 - 2 和測(cè)試 -3 @BeforeClass 注解下的 setUp() -> Test-1、Test-2 和 Test-3 -> @AfterClass 注解下的 tearDown()
TestNG 框架
測(cè)試 - 1、測(cè)試 - 2 和測(cè)試 -3 @BeforeTest(或@BeforeClass)注解下的setUp() -> Test-1、Test-2和Test-3 -> @AfterTest(或@AfterClass)注解下的tearDown()
在這種情況下,所有測(cè)試場(chǎng)景都會(huì)使用同一個(gè)瀏覽器實(shí)例,并且一旦所有測(cè)試執(zhí)行完成后,該實(shí)例就會(huì)被銷(xiāo)毀。當(dāng)然,如果測(cè)試必須在不同的瀏覽器和操作系統(tǒng)組合上運(yùn)行時(shí),則不能使用相同的技術(shù),而必須在每個(gè)測(cè)試場(chǎng)景之后創(chuàng)建和銷(xiāo)毀測(cè)試組合。
使用Selenium進(jìn)行自動(dòng)化測(cè)試的顯式等待
Selenium中的隱式等待被應(yīng)用于測(cè)試腳本中的所有Web元素。而隱式等待的主要缺點(diǎn)在于您無(wú)法在元素可見(jiàn)、可點(diǎn)擊、可選擇等條件下執(zhí)行等待。與此同時(shí),Selenium中的顯式等待則允許您對(duì)頁(yè)面上存在的WebElement執(zhí)行有條件的等待。例如,如果某個(gè)被指定的WebElement在顯式等待所規(guī)定的持續(xù)時(shí)間內(nèi)可見(jiàn),那么就會(huì)觸發(fā)ElementNotVisibleException。如果已定位的元素是可點(diǎn)擊的,那么elementToBeClickable方法將返回一個(gè)WebElement。
WebDriverWait和ExpectedConditions類(lèi)的組合可被用于在WebElements上執(zhí)行顯式等待。顯式等待的好處在于它是在代碼層面,而非遠(yuǎn)程Selenium部分上運(yùn)行的。顯式等待無(wú)需等到設(shè)定時(shí)間的結(jié)束,而是在滿足指定條件時(shí),便可立即退出等待。如果設(shè)定的條件一旦找到了WebElement,就會(huì)將該元素作為結(jié)果予以返回。如果WebElement在DOM中并不存在,即使條件中指定時(shí)間已過(guò),它也會(huì)觸發(fā)TimeoutException。
在下面的代碼段中,我們對(duì)visibilityOfElementLocated條件執(zhí)行了5秒鐘的顯式等待。如果ID = 'element'的WebElement在5秒內(nèi)被找到,那么該顯式等待就會(huì)退出,并返回所需的WebElement。
Java
/* Trigger an explicit wait of 5 Seconds */
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("element"))
由于只要找到元素就可以訪問(wèn)WebElement,因此實(shí)際的等待時(shí)間可能會(huì)少于設(shè)定的等待時(shí)間,那么顯式等待的測(cè)試腳本的性能會(huì)更好,也會(huì)使得Selenium測(cè)試運(yùn)行得更快。
創(chuàng)建原子性和自主式測(cè)試腳本
無(wú)論測(cè)試場(chǎng)景有多么復(fù)雜,我們都需要將復(fù)雜的場(chǎng)景分解成為多個(gè)“獨(dú)立和原子性”的測(cè)試用例。
像TestNG之類(lèi)的自動(dòng)化測(cè)試框架能夠支持通過(guò)諸如dependsOnMethods(用于各種方法)和dependsOnGroups(用于各個(gè)組)等注釋,來(lái)聲明測(cè)試方法之間的顯式依賴關(guān)系。但是,只有當(dāng)您希望在測(cè)試方法之間共享數(shù)據(jù)和狀態(tài)時(shí),才應(yīng)該在Selenium測(cè)試腳本中使用測(cè)試依賴項(xiàng)。
同時(shí),由于原子性測(cè)試可被用于故障檢測(cè),因此我們需要通過(guò)保持測(cè)試的簡(jiǎn)短和原子態(tài),來(lái)減少維護(hù)測(cè)試的工作量??梢哉f(shuō),有了原子性的保證,我們不但可以最大限度地減少測(cè)試的依賴性,而且有助于隔離測(cè)試中出現(xiàn)的問(wèn)題,并加快Selenium測(cè)試的整體效率。
在Selenium自動(dòng)化中利用并行測(cè)試
Selenium中的并行測(cè)試可以讓您在不同的測(cè)試環(huán)境中,同時(shí)運(yùn)行相同的測(cè)試。如果您計(jì)劃使用內(nèi)部Selenium Grid進(jìn)行分布式測(cè)試,那么您可以利用Selenium Grid 4所提供的功能,來(lái)加速測(cè)試場(chǎng)景的執(zhí)行。
根據(jù)所測(cè)場(chǎng)景的不同,您可以選擇“類(lèi)”級(jí)別或“方法”級(jí)別中的任何一種開(kāi)展并行化測(cè)試。而此類(lèi)測(cè)試主要可以對(duì)如下三個(gè)方面予以增強(qiáng):
- 對(duì)測(cè)試場(chǎng)景分組
- 測(cè)試場(chǎng)景的參數(shù)化
- 選擇基于云的Selenium Grid
對(duì)測(cè)試場(chǎng)景分組
隨著更多的測(cè)試文件和測(cè)試方法被添加,測(cè)試套件的復(fù)雜性會(huì)成倍增加。為了最大限度地減少測(cè)試套件在實(shí)現(xiàn)和維護(hù)上的復(fù)雜性,我們需要根據(jù)被測(cè)的功能,對(duì)測(cè)試進(jìn)行分組。
正如下面對(duì)TestNG測(cè)試用例進(jìn)行分組所展示那樣,我們創(chuàng)建了兩個(gè)測(cè)試組(即Search和ToDo),并在“方法”級(jí)別并行執(zhí)行。TestNG中的線程計(jì)數(shù)屬性允許您通過(guò)指定在測(cè)試執(zhí)行期間要?jiǎng)?chuàng)建的最大線程數(shù),來(lái)并行開(kāi)展測(cè)試。
可見(jiàn),分組測(cè)試場(chǎng)景降低了維護(hù)測(cè)試套件的復(fù)雜性,同時(shí)也加快了執(zhí)行時(shí)間。當(dāng)然,這些都取決于為實(shí)現(xiàn)并行化而選擇的方法。
使用Selenium 4(而不是Selenium 3)
Selenium 4是Selenium自動(dòng)化框架中最受期待的版本之一。目前,Selenium 4的最新版本為??4.0.0-beta-1??。它在如下方面進(jìn)行了顯著的改進(jìn)和增強(qiáng):
- 改進(jìn)和優(yōu)化了Selenium Grid
- 對(duì)Selenium WebDriver予以了W3C標(biāo)準(zhǔn)化
- 增強(qiáng)了Selenium 4的IDE
- 引入了Chrome DevTools
- 引入了相對(duì)定位器(Relative Locators)
總地說(shuō)來(lái),Selenium 4中的增強(qiáng)功能可以在加速Selenium測(cè)試方面發(fā)揮重要的作用。
過(guò)去,Selenium 3使用JSON有線協(xié)議,在Web瀏覽器和測(cè)試代碼之間進(jìn)行通信。這會(huì)導(dǎo)致使用W3C協(xié)議對(duì)API請(qǐng)求進(jìn)行編、解碼而產(chǎn)生額外的開(kāi)銷(xiāo)。而Selenium 4直接使用WebDriver W3C協(xié)議,從而加快了與Web瀏覽器的通信。這種架構(gòu)更改不但加快了Selenium測(cè)試,而且提高了測(cè)試的穩(wěn)定性。
下圖展示的是在Selenium 4中新引入的相對(duì)定位器。當(dāng)它在訪問(wèn)臨近的特定WebElement時(shí),非常實(shí)用。
與頁(yè)面上的每個(gè)WebElement使用find_element()和find_elements()方法不同,相對(duì)定位器通過(guò)與TagName(在Selenium 4的Java中)結(jié)合使用,可以讓您以更快的速度訪問(wèn)到相對(duì)WebElement。因此,在您必須訪問(wèn)相對(duì)于DOM元素的WebElement場(chǎng)景時(shí),相對(duì)定位器可以加速Selenium測(cè)試。
值得一提的是,從Selenium 3升級(jí)到Selenium 4是無(wú)縫的,您應(yīng)當(dāng)檢查版本,以確認(rèn)是否真的能夠利用Selenium 4所提供的特性和功能,來(lái)加速Selenium測(cè)試。
使用基于云的Selenium Grid進(jìn)行自動(dòng)化測(cè)試
當(dāng)涉及到網(wǎng)格的可擴(kuò)展性和可靠性時(shí),在本地Selenium Grid上并行運(yùn)行測(cè)試,存在著一個(gè)嚴(yán)重的缺陷:它并不適用于在大量瀏覽器、操作系統(tǒng)和設(shè)備的組合上,并行地執(zhí)行針對(duì)大型Web應(yīng)用的多個(gè)測(cè)試套件。
所謂云端的Selenium測(cè)試,是指在可靠且可擴(kuò)展的、基于云服務(wù)的Selenium Grid上并行開(kāi)展測(cè)試,因此它有助于加快Selenium測(cè)試。由下面顯示的testng.xml文件示例可知,該并行是在“測(cè)試”級(jí)別上實(shí)現(xiàn)的。即:每個(gè)<test>標(biāo)記都在單獨(dú)的線程中運(yùn)行。
從下面的執(zhí)行快照中可以看出,這兩個(gè)測(cè)試都是在基于云端的Selenium Grid上并行運(yùn)行的。
使用由基于云端的Selenium Grid所提供的功能,您可以并行運(yùn)行“N”個(gè)測(cè)試(此處的“N”取決于您計(jì)劃支持的“最大并發(fā)會(huì)話數(shù)”),進(jìn)而加快Selenium測(cè)試。
通過(guò)禁用網(wǎng)頁(yè)上的圖像來(lái)實(shí)現(xiàn)更快的頁(yè)面加載
一旦創(chuàng)建了Selenium WebDriver實(shí)例,Selenium中的driver.get()方法將被用于打開(kāi)被測(cè)頁(yè)面。網(wǎng)頁(yè)的加載速度往往取決于頁(yè)面的組成。如果頁(yè)面上有大量的圖像的話,那么頁(yè)面的加載時(shí)間就會(huì)增加。
因此,通過(guò)使用特定于瀏覽器的設(shè)置,您可以按需禁用在相應(yīng)的Web瀏覽器中加載圖像,以加快網(wǎng)頁(yè)的加載速度。
運(yùn)行Selenium腳本時(shí),禁用Chrome中的圖像加載
如下代碼段展示了如何實(shí)現(xiàn)在Chrome中禁用圖像的加載,以加快Selenium測(cè)試:
Java
package com.disableimages;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.testng.annotations.AfterTest;
import org.testng.annotations.Test;
import java.util.HashMap;
public class test_disable_image_demo
{
String test_url = "https://www.amazon.com";
WebDriver driver = null;
(enabled=true, priority = 1)
public void test_disable_images_chrome() throws InterruptedException
{
ChromeOptions options =new ChromeOptions();
HashMap<String, Object> prefs = new HashMap<String, Object>();
prefs.put("profile.managed_default_content_settings.images", 2);
options.setExperimentalOption("prefs", prefs);
driver = new ChromeDriver(options);
driver.get(test_url);
driver.manage().window().maximize();
Thread.sleep(5000);
}
public void tearDown()
{
if (driver != null)
{
driver.quit();
}
}
}
在上述代碼實(shí)現(xiàn)中,我們通過(guò)將Firefox的首選項(xiàng)--permissions.default.image設(shè)置為2,以禁用從Amazon處加載圖像。該方法對(duì)于需要加載大量圖像的測(cè)試頁(yè)面的情況,非常有效。
使用數(shù)據(jù)驅(qū)動(dòng)測(cè)試進(jìn)行參數(shù)化
在某些情況下,您需要跨多個(gè)瀏覽器和操作系統(tǒng)的組合,或針對(duì)不同輸入的組合,運(yùn)行特定的場(chǎng)景測(cè)試。眾所周知,對(duì)測(cè)試方法中的值進(jìn)行硬編碼,并不是一個(gè)好的習(xí)慣。您應(yīng)該使用參數(shù)化,來(lái)針對(duì)大量的數(shù)據(jù)集運(yùn)行測(cè)試。目前,所有主流的自動(dòng)化框架,包括:用于Selenium C#的MSTest、NUnit等,用于Selenium Java的JUnit、TestNG等,以及用于Selenium Python的PyTest等,都支持參數(shù)化測(cè)試。
針對(duì)那些必須在多個(gè)測(cè)試組合(或測(cè)試輸入)中運(yùn)行相同測(cè)試的需求,您可以通過(guò)諸如TestNG之類(lèi)的自動(dòng)化測(cè)試框架,讓testng.xml來(lái)傳遞參數(shù),進(jìn)而在“測(cè)試”級(jí)別實(shí)現(xiàn)并行的參數(shù)化測(cè)試,以顯著地加快Selenium測(cè)試,并提高測(cè)試的覆蓋率。
按需使用無(wú)頭(Headless)瀏覽器和驅(qū)動(dòng)程序
運(yùn)行Selenium自動(dòng)化測(cè)試的一個(gè)目的是,檢查并驗(yàn)證底層UI元素的交互。對(duì)此,您需要通過(guò)在非無(wú)頭(non-headless)模式下調(diào)用瀏覽器驅(qū)動(dòng)程序,來(lái)驗(yàn)證交互。
同時(shí),無(wú)頭瀏覽器允許您在沒(méi)有瀏覽器或任何其他GUI下,運(yùn)行瀏覽器UI測(cè)試。目前,Chrome、Firefox等流行的瀏覽器都可以在無(wú)頭模式下運(yùn)行。由于跨瀏覽器測(cè)試是在后端運(yùn)行的,因此無(wú)頭測(cè)試提高了跨瀏覽器測(cè)試的整體性能。請(qǐng)參考如下代碼段:
Java
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("build", "your build name");
capabilities.setCapability("name", "your test name");
capabilities.setCapability("platform", "Windows 10");
capabilities.setCapability("browserName", "Chrome");
capabilities.setCapability("version","89.0");
capabilities.setCapability("headless",true);
當(dāng)您不打算檢查通過(guò)測(cè)試腳本、以及相應(yīng)的瀏覽器驅(qū)動(dòng)程序去實(shí)現(xiàn)的UI交互時(shí),就可以使用無(wú)頭瀏覽器測(cè)試??梢哉f(shuō),沒(méi)有瀏覽器UI和無(wú)頭瀏覽器的各種UI,都可以起到加速Selenium測(cè)試的效果。
目前,此類(lèi)主流無(wú)頭瀏覽器(或驅(qū)動(dòng)程序)包括:HtmlUnit、Splash、PhantomJS、TrifleJS、ZombieJS、以及SimpleBrowser。其中,基于HtmlUnit的HtmlUnitDriver是Selenium WebDriver無(wú)頭瀏覽器的輕量級(jí)實(shí)現(xiàn)。HtmlUnitDriver是與Chrome和Firefox類(lèi)似的瀏覽器驅(qū)動(dòng)程序,不過(guò)它并不提供GUI。因此,您可以靈活地在主流瀏覽器的無(wú)頭版本、以及HtmlUnitDriver上,執(zhí)行跨瀏覽器測(cè)試。
用Java編寫(xiě)的HtmlUnit瀏覽器能夠支持AJAX和JavaScript的處理。同時(shí),它也提供了部分渲染的功能。下面展示的是用于創(chuàng)建HtmlUnitDriver實(shí)例,并使用它在Selenium中執(zhí)行瀏覽器測(cè)試的代碼片段:
JavaScript
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
/* Create a new instance of the HtmlUnitDriver */
WebDriver driver = new HtmlUnitDriver();
/* Perform necessary actions as per the desired test requirement */
.
.
/* Release the resources held by HtmlUnitDriver */
driver.quit();
而PhantomJS是另一種流行的、基于JavaScript API的無(wú)頭瀏覽器選擇項(xiàng)。它使用QtWebKit作為后端,并為流行的Web標(biāo)準(zhǔn)提供了諸如JSON、Canvas、SVG、以及DOM等原生的處理支持。PhantomJS 2.1是其最新的穩(wěn)定版本,其中集成了GhostDriver。不過(guò), PhantomJS項(xiàng)目(https://github.com/ariya/phantomjs)目前處于暫停狀態(tài)。
PhantomJS不但可以被用于Windows、Linux和macOS X等流行平臺(tái),而且能夠被廣泛地用于諸如:無(wú)頭Web測(cè)試、頁(yè)面自動(dòng)化、屏幕截圖、以及網(wǎng)絡(luò)監(jiān)控等用例中。
下面顯示的是創(chuàng)建PhantomJS驅(qū)動(dòng)程序?qū)嵗?,并使用它在Selenium中執(zhí)行瀏覽器測(cè)試的代碼片段:
JavaScript
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
/* Create a new instance of the PhantomJS Driver*/
WebDriver driver = new PhantomJSDriver();
/* Perform necessary actions as per the desired test requirement */
.
.
/* Release the resources held by PhantomJS Driver */
driver.quit();
根據(jù)測(cè)試要求,我們?cè)谏鲜龃a中使用了無(wú)頭瀏覽器測(cè)試,來(lái)加速Selenium測(cè)試。當(dāng)然,除了HtmlUnitDriver和PhantomJSDriver之外,Chrome和Firefox等無(wú)頭版本的瀏覽器,也可被用于在Selenium測(cè)試中加速,并獲取更高的準(zhǔn)確性。
小結(jié)
在編寫(xiě)Selenium測(cè)試時(shí),影響性能的主要因素之一便是測(cè)試的運(yùn)行速度。其中,基于云端的Selenium Grid和Selenium并行測(cè)試是加速該過(guò)程的兩種主要方法。同時(shí),我們也介紹了如何通過(guò)采用不同的語(yǔ)言和自動(dòng)化測(cè)試框架,來(lái)加速Selenium測(cè)試,提高測(cè)試性能與覆蓋率、以及交付出更好的產(chǎn)品質(zhì)量。
譯者介紹
陳峻 (Julian Chen),51CTO社區(qū)編輯,具有十多年的IT項(xiàng)目實(shí)施經(jīng)驗(yàn),善于對(duì)內(nèi)外部資源與風(fēng)險(xiǎn)實(shí)施管控,專注傳播網(wǎng)絡(luò)與信息安全知識(shí)與經(jīng)驗(yàn);持續(xù)以博文、專題和譯文等形式,分享前沿技術(shù)與新知;經(jīng)常以線上、線下等方式,開(kāi)展信息安全類(lèi)培訓(xùn)與授課。
原文標(biāo)題:??How To Speed Up Selenium Test Cases Execution???,作者:Himanshu Sheth?