開源中國大佬是怎么用Selenium做自動化web測試的

簡介

Selenium 是一個健壯的工具集合嫩码,跨很多平臺支持針對基于 web 的應(yīng)用程序的測試自動化的敏捷開發(fā)誉尖。它是一個開源的、輕量級的自動化工具铸题,很容易集成到各種項(xiàng)目中铡恕,支持多種編程語言,比如 .NET丢间、Perl探熔、Python、Ruby 和 Java? 編程語言烘挫。

利用 Selenium 測試 Ajax 應(yīng)用程序

Asynchronous JavaScript and XML (Ajax) 是一種用于創(chuàng)建交互式 web 應(yīng)用程序的 web 開發(fā)技術(shù)诀艰。Ajax 應(yīng)用程序的一個特征是,不會導(dǎo)致一次重新加載整個頁面饮六。相反其垄,瀏覽器將具有一個對服務(wù)器的異步調(diào)用以獲得數(shù)據(jù),并且只刷新當(dāng)前頁面的特定部分卤橄。要提高 web 頁面的交互性绿满、響應(yīng)速度和可用性,測試 Ajax 應(yīng)用程序的過程需要一些改變窟扑。

我們首先刷新 web 頁面棒口,然后就是等待寄月,直到異步調(diào)用完成。完成之后无牵,可以繼續(xù)進(jìn)行驗(yàn)證漾肮。此時,出現(xiàn)適當(dāng)?shù)却龝r間的問題茎毁。

一種選擇是在測試應(yīng)用程序中簡單地暫停一段固定的時間克懊,這在大多數(shù)情況下都是可行的。在有些情況下七蜘,比如說網(wǎng)絡(luò)吞吐量很慢時谭溉,Ajax 調(diào)用在暫停一段特定的時間之后沒有完成,會導(dǎo)致測試用例失敗橡卤。另一方面扮念,如果暫停時間太長,會使得測試慢得不可接受碧库。

Selenium 提供了更為高效的處理等待的方式柜与。一種可能做法是,使用類 com.thoughtworks.selenium.Wait 來等待一個元素或文本在頁面上出現(xiàn)或消失嵌灰∨埃可以在 until() 函數(shù)中定義等待的退出條件,或者擴(kuò)展 Wait 類來實(shí)現(xiàn)等待退出沽瞭。清單 1 是使用 Wait 類的樣例代碼迁匠。它將在條件滿足時停止等待,或者在超出最大等待時間時返回一個超時異常驹溃。

清單 1. 等待元素或文本出現(xiàn)

    Wait wait = new Wait() {
    public boolean until() {
    return selenium.isElementPresent(locator);
    // or selenium.isTextPresent(pattern);
 }
};
wait.wait("", timeoutInMilliseconds);

另一種選擇是使用 Selenium 中的 waitForCondition 函數(shù)城丧,一個 JavaScript 代碼片段將被作為參數(shù)傳遞給該函數(shù)。一旦 Selenium 檢測到條件返回為真豌鹤,它將停止等待亡哄。您可以等待一些元素或文本出現(xiàn)或者不出現(xiàn)。JavaScript 可以運(yùn)行在由 Selenium.browser.getCurrentWindow() 函數(shù)彈出的應(yīng)用程序窗口中傍药。清單 2 是檢查窗口狀態(tài)的樣例代碼磺平。它只工作在 Firefox 中魂仍。

清單 2. 等待窗口就緒的狀態(tài)

String script = "var my_window = selenium.browserbot.getCurrentWindow();" 
script += "var bool;";
 script += "var readyState = (my_window.document.readyState);";
script += "if (readyState == 'complete'){";
script += "bool = 'true';";
script += "}";
script += "bool;";
selenium.waitForCondition(script, timeoutInMilliseconds);

如何支持 dojo 應(yīng)用程序

Dojo 是一個常用的 JavaScript 工具包拐辽,用于構(gòu)造動態(tài) web 界面。使用 Selenium 測試 Dojo 應(yīng)用程序時的一個關(guān)鍵點(diǎn)是認(rèn)識 Dojo 小部件和記錄它們的操作擦酌。作者定義的 Dojo 小部件處于抽象級別俱诸。頁面運(yùn)行時,會將 Dojo 小部件轉(zhuǎn)換成基本的 HTML 代碼赊舶。存在很多由 Dojo 自動生成的 HTML 代碼睁搭,因此赶诊,Dojo 小部件的認(rèn)識可能與傳統(tǒng) HTML 小部件有些不同。

Dojo 小部件上執(zhí)行的操作(包括文本字段园骆、按鈕復(fù)選框和單選按鈕)可能與 HTML 小部件相同舔痪。但是,Dojo 在組合框上提供的日期選擇器和其他額外的小部件可能需要特定的處理锌唾。

圖 1. Dojo 組合框

展示帶幾個選項(xiàng)的組合框的屏幕快照

使用 Selenium IDE 來記錄圖 1 中提供的組合框上選中的操作锄码。單擊向下箭頭,會出現(xiàn)一個下拉列表晌涕。選中第三項(xiàng) Stack(SWG)滋捶。記錄的腳本提供在圖 2 中。

圖 2. Selenium IDE 記錄的腳本

展示 Selenium 所記錄信息(比如鼠標(biāo)單擊)的屏幕快照

有時余黎,只會由 IDE 生成第二行腳本重窟。在這種情況下,添加單擊箭頭按鈕的操作惧财。對于上面的腳本巡扇,如果第一行被重新播放,那么它應(yīng)該生成下拉列表可缚。但是它不執(zhí)行任何操作霎迫。對于多個 Dojo 小部件,單擊并不真正執(zhí)行單擊操作帘靡。將 click(locator) 更改為 clickAt(locator, coordString) 或者 MouseDown(locator)MouseUp(locator)知给。

對于下拉列表,等待時間應(yīng)該相加描姚。像圖 2 中展示的腳本一樣涩赢,選中項(xiàng)的單擊操作將會剛好在單擊向下箭頭按鈕之后執(zhí)行。它可能會因?yàn)橄吕斜頉]有出現(xiàn)而失敗轩勘。簡單地添加一個 pause 命令筒扒,或者使用 waitFor 命令等待菜單項(xiàng)元素出現(xiàn),并繼續(xù)執(zhí)行下一個命令绊寻。

修改后的將會自動化 Dojo 組合框上的選擇的腳本展示在圖 3 中花墩。

圖 3. 修改后的在 Dojo 組合框中進(jìn)行選擇的 IDE 腳本

屏幕快照展示 clickAt、waitForElement 和 ClickAt 命令已修改

RC 代碼展示在清單 3 中澄步。

清單 3. 自動化 Dojo 組合框中選擇操作的 RC 代碼

selenium.clickAt("http://div[@id='widget_offeringType']/div/div",””);
selenium.waitForCondition("selenium.isElementPresent(\"offeringType_popup2\")", "2000");
selenium.clickAt("offeringType_popup2",””);

圖 4. 日期選擇器

展示日期選擇器的常規(guī)月歷視圖的屏幕快照

如果對軟件測試冰蘑、接口測試、自動化測試村缸、性能測試祠肥、LR腳本開發(fā)、面試經(jīng)驗(yàn)交流梯皿。感興趣可以175317069仇箱,群內(nèi)會有不定期的發(fā)放免費(fèi)的資料鏈接县恕,這些資料都是從各個技術(shù)網(wǎng)站搜集、整理出來的剂桥,如果你有好的學(xué)習(xí)資料可以私聊發(fā)我忠烛,我會注明出處之后分享給大家。

對于圖 4 中的日期選擇器例子权逗,執(zhí)行的操作可能不會被 IDE 記錄况木。編寫如下面清單 4 所示的 RC 代碼。

清單 4. 自動化選擇的 RC 代碼

//click on the date field by id you defined;
selenium.clickAt("dateBox",""); 
//wait for the drop down date box by id;
selenium.waitForCondition("selenium.isElementPresent(\"widget_dateBox_dropdown\")", \
"2000"); 
//click previous year 2008;
selenium.clickAt("http://span[contains(@class,'dijitCalendarPreviousYear')]", "");
//click on the month increase; 
//previous month would contains  ‘dijitCalendarIncrease’.
selenium.clickAt("http://img[contains(@class,'dijitCalendarIncrease')]","");
//click on the date such as 28 of current month; If you do not specify 
//the td with the attribute of current month class, it will click \
on the //first 28 of previous month;
selenium.click("http://td[contains(@class,'dijitCalendarCurrentMonth')]/span[text()='28']");

如本例所示旬迹,Dojo 應(yīng)用程序不能通過簡單的 IDE 記錄進(jìn)行測試火惊。這些腳本有可能不能通過測試。腳本中有一些丟失的操作奔垦,或者操作并不真正工作屹耐。腳本應(yīng)該調(diào)整成能夠在 IDE 和 RC 中順利地執(zhí)行。對于復(fù)雜的 Dojo 小部件椿猎,一種可能的解決方案是使用 runScript(String) 函數(shù)惶岭,因?yàn)?Selenium 對 JavaScript 提供很好的支持。清單 5 提供一個 JavaScript 語句來模擬組合框選擇犯眠。

清單 5. 運(yùn)行 JavaScript 語句在組合框上進(jìn)行選擇

selenium.runScript("dijit.byId(\"offeringType\").setValue(\"Stack(SWG)");");                

如何利用 Ant 構(gòu)建 Selenium 測試

諸如 Ant 這樣的集成工具可以方便地構(gòu)建 Selenium 測試和順暢地運(yùn)行測試用例按灶,無需單獨(dú)啟動 Selenium 服務(wù)器。如果 Selenium 測試由 TestNG 驅(qū)動筐咧,那么定義清單 6 所示 TestNG Ant 任務(wù)鸯旁。清單 6 中假設(shè) classpath 是 TestNG.jar 文件的文件路徑。

清單 6. TestNG Ant 任務(wù)

<taskdef resource="**testngtasks**" classpath="**testng.jar**"/>       

主要的目標(biāo)是啟動服務(wù)器量蕊、運(yùn)行測試铺罢,然后停止服務(wù)器。這些任務(wù)按照 bulid.xml 中定義的順序?qū)崿F(xiàn)在清單 7 中残炮。

清單 7. 啟動服務(wù)器韭赘、運(yùn)行測試用例并停止服務(wù)器的 Ant 任務(wù)

<target name="run_test" description="start,run and stop" depends="dist">
<parallel>
 <antcall target="**start-server**" /> 
<sequential>
 <echo taskname="waitfor" message="Waitforproxy server launch" /> 
 <waitfor maxwait="2" maxwaitunit="minute" checkevery="100">
 <http url="http://localhost:4444/selenium-server/driver/?cmd=testComplete" /> 
 </waitfor>
 <antcall target="**runTestNG**" /> 
 <antcall target="**stop-server**" /> 
 </sequential>
 </parallel>
 </target>

代碼更可取的地方是使用 waitfor 任務(wù)來測試 Selenium 服務(wù)器是否已成功啟動,而不是暫停一段固定的時間势就。如果 URL http://localhost:4444/selenium-server/driver/?cmd=testComplete 可用泉瞻,就意味著 Selenium 已經(jīng)成功啟動。在清單 7 中苞冯,它最多等待兩分鐘袖牙,并且每 100 毫秒在本地主機(jī)上檢查一次 Selenium 服務(wù)器,以提供完整的 URL抱完。

start-server 任務(wù)的詳細(xì)內(nèi)容定義在清單 8 中贼陶。Firefox profile 模板位置和其他參數(shù)可以指定在標(biāo)記 <arg> 中刃泡。

清單 8. 詳細(xì)的啟動服務(wù)器的 Ant 任務(wù)

<target name="start-server">
<java jar="lib/selenium-server.jar" fork="true">
 <arg line="-firefoxProfileTemplate ${selenium}/profile/" /> 
 </java>
 </target>

runTestNG 任務(wù)的詳細(xì)內(nèi)容定義在清單 9 中巧娱。testng任務(wù)的常用屬性包括 outputDirxmlfileset碉怔。屬性 outputDir 用于設(shè)置輸出報告位置。屬性 xmlfileset 用于包含啟動 XML 文件禁添。更多選項(xiàng)請參考 TestNG 正式網(wǎng)站撮胧。

清單 9. 運(yùn)行測試用例的 Ant 任務(wù)

<target name="runTestNG">
<testng outputDir="${testng.report.dir}" sourcedir="${build}" 
classpathref="run.cp" haltOnfailure="true">
 <xmlfileset dir="${build}" includes="testng.xml" /> 
 </testng>
 </target>

stop-server 任務(wù)的詳細(xì)內(nèi)容定義在清單 10 中。

清單 10. 停止 Selenium 服務(wù)器的 Ant 任務(wù)

<target name="stop-server">
 <get taskname="selenium-shutdown" 
src="http://localhost:4444/selenium-server/driver/?cmd=shutDown" ignoreerrors="true" /> 
 <echo taskname="selenium-shutdown" message=" Errors during shutdown are expected" /> 
 </target>

上面列出了關(guān)鍵任務(wù)老翘。將它們組合到您的構(gòu)建文件芹啥,以便利用 Ant 完成良好集成的測試。

如何支持測試 HTTPS 網(wǎng)站

隨著互聯(lián)網(wǎng)日益強(qiáng)調(diào)信息安全铺峭,越來越多的 web 應(yīng)用程序在使用 SSL 身份認(rèn)證墓怀。Selenium IDE 默認(rèn)支持 HTTPS,但是 Selenium RC 不是這樣的卫键。Internet Explorer 和 Firefox 中的解決方案各不相同傀履。

對于 IE,在 setup 目錄下的 SSL 支持文件夾中在安裝一個證書莉炉。如果使用的版本早于 Selenium-RC 1.0 beta 2钓账,請使用 *iehta 運(yùn)行模式,對于 Selenium-RC 1.0 beta 2 或更晚的版本絮宁,使用 *iexplore 運(yùn)行模式梆暮。

如果測試 HTTPS 網(wǎng)站時出現(xiàn)一個如下所示的安全警告,那么單擊 View Certificate 并安裝 HTTPS 網(wǎng)站的證書绍昂。如果繼續(xù)彈出警告啦粹,那么考慮在 IE 中進(jìn)行配置。打開 Tool > Internet Options > Advanced窘游,并取消選擇 security 分類下的 Warn about invalid site certificatesCheck for publisher's certificate revocation卖陵。

圖 5. 測試 HTTPS 網(wǎng)站時的安全警告

展示指出證書未證實(shí)的 Security Alert 的屏幕快照

創(chuàng)建新的 Firefox 配置文件

對于 Firefox,遵循以下步驟創(chuàng)建定制的配置文件张峰,然后重啟服務(wù)器:

  1. 關(guān)閉任何正在運(yùn)行的 Firefox 實(shí)例泪蔫。
  2. 利用配置文件管理器 firefox -ProfileManager 啟動 Firefox。
  3. 創(chuàng)建一個新的配置文件喘批。出現(xiàn)提示時撩荣,為配置文件選擇一個目錄。將它放在項(xiàng)目文件夾里面饶深。
  4. 選擇配置文件并運(yùn)行 Firefox餐曹。
  5. 利用您將用于測試的自簽名證書導(dǎo)航到 HTTPS URL。 出現(xiàn)提示時接受證書敌厘。這將在配置文件中創(chuàng)建一個異常台猴。
  6. 關(guān)閉瀏覽器。
  7. 轉(zhuǎn)到 Firefox 配置文件目錄。
  8. 刪除該目錄中除 cert_override.txtcert8.db 文件之外的任何東西饱狂。

默認(rèn)情況下曹步,Selenium 將在啟動 Firefox 的實(shí)例時創(chuàng)建一個新的配置文件。當(dāng)您利用參數(shù) -firefoxProfileTemplate /path/to/profile/dir 啟動服務(wù)器時休讳,Selenium 將使用一個部分配置文件(帶有證書異常)作為創(chuàng)建新配置文件的基礎(chǔ)讲婚。這將提供證書異常,而避免了使用整個配置文件帶來額外的混亂俊柔。注意一下在 Selenium RC 1.0 Beta 2 或更晚版本中以 *firefox 模式筹麸,以及在 Selenium RC 1.0 Beta 2 之前的版本中以 *chrome 模式啟動 Firefox。

對于運(yùn)行模式雏婶,*chrome*iehta 是較早版本 Selenium RC 中支持 HTTPS 和安全彈出處理的實(shí)驗(yàn)?zāi)J轿锔稀W?Selenium-RC 1.0 beta 2 起,它們已經(jīng)穩(wěn)定成 *firefox*iexplore 運(yùn)行模式留晚。請謹(jǐn)慎地根據(jù)所使用的 Selenium 版本而使用運(yùn)行模式块差。

如何高效地認(rèn)識不帶 ID 屬性的 web 元素

使用一個有含義的 ID 或名稱是一種高效且方便的定位元素的方式。它也可以改善測試用例的可讀性倔丈。但是為了每個元素具有一個有含義的憨闰、惟一的 ID(尤其是動態(tài)元素),Selenium 提供多種策略來認(rèn)識元素需五,比如說 Xpath鹉动、DOM 和 CSS。

下面是一個樣例宏邮,使用三種策略來定位圖 6 中提供的動態(tài)表格中的一個元素泽示。HTML 代碼在清單 11 中。

圖 6. 動態(tài)表格樣例

展示動態(tài)創(chuàng)建的簡單表格(帶有兩列和編輯鏈接)的屏幕快照

清單 11. 第一個表格列的 HTML 代碼

    <table id="test_table" border="1">
        <tbody>
        <tr>
            <td align="left">
                <div class="test_class">Test 1</div>
            </td>
            <td align="center" style="vertical-align: top;">
                <table id="AUTOGENBOOKMARK_4">
                    <tbody>
                        <tr>
                            <td align="center" style="vertical-align: top;">
                                <div>
                                  <img alt="supported" src="supported.png"/>
                                </div>
                            </td>
                            <td align="center" style="vertical-align: top;">
                                <div>
                                   <a href="test?name=test1">edit</a>
                                </div>
                            </td>
    …….

Xpath 是一種找到不帶特定 ID 或名稱的元素的簡單方式蜜氨。

  • 如果知道 ID 或名稱之外的一個屬性械筛,那么直接使用 @attribute=value 定位元素。
  • 如果只知道屬性值的一些特定部分飒炎,那么使用 contains(attribute, value) 定位元素埋哟。
  • 如果元素沒有指定的屬性,那么利用 Firebug 搜索最近的具有指定屬性的父元素郎汪,然后使用 Xpath 從這個元素開始定位想要找到的那個元素赤赊。

表 1. 定位元素的 Xpath 表達(dá)式

表 1 展示了定位元素的 Xpath 表達(dá)式。在 Firebug 的幫助下煞赢,Xpath 可以定位元素和復(fù)制的元素抛计。在元素沒有 ID 和名稱時,Selenium IDE 將會采用 Xpath照筑。盡管 Xpath 利用已經(jīng)錄的腳本吹截,有助于保持一致性瘦陈,但是它高度依賴于 web 頁面的結(jié)構(gòu)。這使得測試用例可讀性差波俄,增加了維護(hù)難度晨逝。此外,在 Internet Explorer 7 和 Internet Explorer 8 中運(yùn)行具有多個復(fù)雜 Xpath 表達(dá)式的測試用例可能會太慢了弟断。在這種情況下,將 Xpath 更換為 DOM趴生,后者是另一種高效的定位策略阀趴。

DOM 是 Document Object Model(文檔對象模型)的縮寫。Selenium 允許您利用 JavaScript 遍歷 HTML DOM苍匆。Java 的靈活性允許在 DOM 表達(dá)式中有多個語句刘急,用分號隔開,以及在語句中定義函數(shù)浸踩。

表 2. 定位元素的 DOM 表達(dá)式

表 2 展示了定位元素的 DOM 表達(dá)式叔汁。DOM 定位器在 Firefox 和 Internet Explorer 中也有很好的性能。組織 DOM 表達(dá)式需要一些 JavaScript 知識检碗。有時据块,DOM 表達(dá)式對于復(fù)雜的元素來說太長了,難以看懂(參見表 2 中提到的 Test 1 的編輯鏈接的表達(dá)式)折剃。

CSS 定位器用于利用 CSS 選擇器選擇元素另假。當(dāng) HTML 代碼具有良好的樣式時,可以高效地利用 CSS 定位器怕犁。樣例表達(dá)式展示在表 3 中边篮。

表 3. 定位元素的 CSS 表達(dá)式

如果對軟件測試、接口測試奏甫、自動化測試戈轿、性能測試、LR腳本開發(fā)阵子、面試經(jīng)驗(yàn)交流思杯。感興趣可以175317069,群內(nèi)會有不定期的發(fā)放免費(fèi)的資料鏈接挠进,這些資料都是從各個技術(shù)網(wǎng)站搜集智蝠、整理出來的,如果你有好的學(xué)習(xí)資料可以私聊發(fā)我奈梳,我會注明出處之后分享給大家杈湾。

一般來說,選用熟悉的定位器表達(dá)式攘须,并在腳本結(jié)構(gòu)中保持一致漆撞。如果有多種表達(dá)式可執(zhí)行,那么使用最高效的方式在 web 頁面中定位元素。

如何處理彈出窗口

一般來說浮驳,操作都是在由 Selenium 啟動的主窗口中執(zhí)行悍汛。如果您想在一個由 window.open 函數(shù)生成的新窗口中執(zhí)行操作,那么將焦點(diǎn)更換到新窗口至会。在彈出窗口中執(zhí)行操作之后离咐,焦點(diǎn)返回到主窗口。處理彈出窗口的過程定義在清單 12 中奉件。

清單 12. 處理彈出窗口的樣例代碼

//wait for the popup window with timeout;
selenium.waitForPopUp(windowname, timeout); 
//select the pop up window
selenium.selectWindow(popupWindowIdentifier);
//perform action on popup window and close the window;
.... 
//return to the main window use 'null' 
selenium.selectWindow(null); 

windowname 是調(diào)用 window.open 函數(shù)的第二個參數(shù)宵蛀。上面提到的 popupwindowIdentifier 是一個窗口標(biāo)識符,可以是窗口 ID县貌、窗口名稱术陶、title=the title of the windowvar=javascript variable。如果彈出窗口的屬性未知煤痕,但是真的定義了梧宫,那么使用 getAllWindowIds()getAllWindowNames()getAttributeFromAllWindows() 函數(shù)來檢索彈出窗口的屬性摆碉。

在最新版的 Selenium RC 1.0.1 中塘匣,Selenium 添加了像 selectPopUp(String)deselectPopUp() 這樣的方法,它們的功能在以前版本中由 selectWindow(String) 提供巷帝。

清單 13. 處理彈出窗口的彈出函數(shù)

//wait for the popup window with timeout;
selenium.waitForPopUp(“”, timeout); 
//same as selenium.selectWindow
selenium.selectPopUp(“”);
//perform action on popup window and close the window;
.... 
//same as selenium.selectWindow(null);
selenium.deselectPopUp();

清單 13 展示了處理彈出窗口最簡單的方式馆铁。您可以保留 waitForPopUpselectPopUp 函數(shù)中的第一個參數(shù)為空。如果同時彈出多個窗口锅睛,請指定窗口屬性埠巨。

如何處理上載/下載文件窗口

Selenium 使用 JavaScript 來模擬操作。因此现拒,它不支持諸如上載窗口辣垒、下載窗口或身份認(rèn)證窗口之類的瀏覽器元素。對于非主要窗口印蔬,配置瀏覽器跳過彈出窗口勋桶。

圖 7. 安全信息窗口

展示 Security Information 彈出窗口的屏幕快照,指出頁面包含安全的和不安全的條目

跳過圖 7 中安全信息窗口的解決方案是打開 Tools > Internet Options > Custom Level侥猬。然后啟用 Display mixed content例驹。

配置 Internet Explorer 跳過非主要窗口會減少或消除運(yùn)行測試用例時不必要的處理。但是如果配置了 Firefox退唠,那么將它保存為新的配置文件鹃锈,并利用定制的配置文件啟動服務(wù)器。在關(guān)于測試 HTTPS 網(wǎng)站的一節(jié)中提到了這樣做的原因瞧预。

對于上載/下載窗口屎债,最好是處理而不是跳過它們仅政。為了避免 Selenium 的局限性,一種建議是使用 Java 機(jī)器人 AutoIt 來處理文件上載和下載問題盆驹。AutoIt 被設(shè)計(jì)來自動化 Window GUI 操作圆丹。它可以認(rèn)識大多數(shù) Window GUI,提供很多 API躯喇,并且很容易轉(zhuǎn)換為 .exe 文件辫封,這樣的文件可以直接運(yùn)行或者在 Java 代碼中調(diào)用。清單 14 演示了處理文件上載的腳本廉丽。這些腳本的步驟是:

  1. 根據(jù)瀏覽器類型確定上載窗口標(biāo)題倦微。
  2. 激活上載窗口。
  3. 將文件路徑放入編輯框中雅倒。
  4. 提交璃诀。

清單 14. 處理上載的 AutoIt 腳本


;first make sure the number of arguments passed into the scripts is more than 1 
If $CmdLine[0]<2 Then Exit EndIf
 handleUpload($CmdLine[1],$CmdLine[2])

;define a function to handle upload
 Func handleupload($browser, $uploadfile)
     Dim $title                          ;declare a variable
            ;specify the upload window title according to the browser
            If $browser="IE" Then                  ; stands for IE;
          $title="Select file"
            Else                                 ; stands for Firefox
           $title="File upload"
            EndIf

            if WinWait($title,"",4) Then ;wait for window with 
title attribute for 4 seconds;
                   WinActivate($title)                  ;active the window;
                   ControlSetText($title,"","Edit1",$uploadfile)   ;put the 
file path into the textfield  
                   ControlClick($title,"","Button2")                ;click the OK 
or Save button
            Else
            Return False
            EndIf
 EndFunc 

在 Java 代碼中弧可,定義一個函數(shù)來執(zhí)行 AutoIt 編寫的 .exe 文件蔑匣,并在單擊 browse 之后調(diào)用該函數(shù)。

清單 15. 執(zhí)行 AutoIt 編寫的 .exe 文件


public void handleUpload(String browser, String filepath) {
    String execute_file = "D:\\scripts\\upload.exe";
    String cmd = "\"" + execute_file + "\"" + " " + "\"" + browser + "\""
                + " " + "\"" + filepath + "\""; //with arguments
 try {
 Process p = Runtime.getRuntime().exec(cmd);
 p.waitFor(); //wait for the upload.exe to complete
 } catch (Exception e) {
 e.printStackTrace();
 }
}

清單 16 是處理 Internet Explorer 中下載窗口的 AutoIt 腳本棕诵。Internet Explorer 和 Firefox 中的下載腳本各不相同裁良。

清單 16. 處理 Internet Explorer 中下載的 AutoIt 腳本

If $CmdLine[0]<1 Then Exit EndIf
handleDownload($CmdLine[1])
Func handleDownload($SaveAsFileName)
Dim $download_title="File Download" 
If WinWait($download_title,"",4) Then
    WinActivate($download_title)
    Sleep (1000)
    ControlClick($download_title,"","Button2","")
    Dim $save_title="Save As"
    WinWaitActive($save_title,"",4)
    ControlSetText($save_title,"","Edit1", $saveAsFileName)
    Sleep(1000)
    if FileExists ($SaveAsFileName) Then
    FileDelete($SaveAsFileName)
    EndIf
    ControlClick($save_title, "","Button2","")
    Return TestFileExists($SaveAsFileName)
Else
    Return False
EndIf
EndFunc

AutoIt 腳本很容易編寫,但是依賴于瀏覽器類型和版本校套,因?yàn)椴煌臑g覽器和版本中价脾,窗口標(biāo)題和窗口控件類是不相同的。

如何驗(yàn)證警告/確認(rèn)/提示信息

對于由 window.alert() 生成的警告對話框笛匙,使用 selenium.getAlert() 來檢索前一操作期間生成的 JavaScript 警告的消息侨把。如果沒有警告,該函數(shù)將會失敗妹孙。得到一個警告與手動單擊 OK 的結(jié)果相同秋柄。

對于由 window.confirmation() 生成的確認(rèn)對話框,使用 selenium.getConfirmation() 來檢索前一操作期間生成的 JavaScript 確認(rèn)對話框的消息蠢正。默認(rèn)情況下骇笔,該函數(shù)會返回 true,與手動單擊 OK 的結(jié)果相同嚣崭。這可以通過優(yōu)先執(zhí)行 chooseCancelOnNextConfirmation 命令來改變笨触。

對于由 window.prompt() 生成的提示對話框,使用 selenium.getPromt() 來檢索前一操作期間生成的 JavaScript 問題提示對話框的消息雹舀。提示的成功處理需要優(yōu)先執(zhí)行 answerOnNextPrompt 命令芦劣。

JavaScript 警告在 Selenium 中不會彈出為可見的對話框。處理這些彈出對話框失敗會導(dǎo)致異常说榆,指出沒有未預(yù)料到的警告持寄。這會讓測試用例失敗源梭。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市稍味,隨后出現(xiàn)的幾起案子废麻,更是在濱河造成了極大的恐慌,老刑警劉巖模庐,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烛愧,死亡現(xiàn)場離奇詭異,居然都是意外死亡掂碱,警方通過查閱死者的電腦和手機(jī)怜姿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疼燥,“玉大人沧卢,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵疲迂,是天一觀的道長躁垛。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮唱歧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘粒竖。我一直安慰自己颅崩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布蕊苗。 她就那樣靜靜地躺著沿后,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岁歉。 梳的紋絲不亂的頭發(fā)上得运,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機(jī)與錄音锅移,去河邊找鬼熔掺。 笑死,一個胖子當(dāng)著我的面吹牛非剃,可吹牛的內(nèi)容都是我干的置逻。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼备绽,長吁一口氣:“原來是場噩夢啊……” “哼券坞!你這毒婦竟也來了鬓催?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤恨锚,失蹤者是張志新(化名)和其女友劉穎宇驾,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猴伶,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡课舍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了他挎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筝尾。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖办桨,靈堂內(nèi)的尸體忽然破棺而出筹淫,到底是詐尸還是另有隱情,我是刑警寧澤呢撞,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布损姜,位于F島的核電站,受9級特大地震影響狸相,放射性物質(zhì)發(fā)生泄漏薛匪。R本人自食惡果不足惜捐川,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一脓鹃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧古沥,春花似錦瘸右、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盹沈,卻和暖如春龄章,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背乞封。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工做裙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肃晚。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓锚贱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親关串。 傳聞我的和親對象是個殘疾皇子拧廊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容