在本節(jié),將介紹Web頁面常見和一些彈出窗口,如上傳文件和彈出窗口。而大部分的彈出窗口,如選擇和上傳文件,大都使用的是本地的Windows窗口,而Selenium僅能操作瀏覽器,這樣就對測試形成了挑戰(zhàn)。Selenium API處理彈出窗口的主要是IAlert接口,詳細如下所示:

13-3 IAlert類.jpg
文件上傳
下圖是一種常見的文件上傳彈出窗口:

13-1 文件上傳示例_c2i.jpg
HTML源碼如下:
<body>
請選擇上傳文件:<input type="file" name="fileUpload" id="fileUpload" size="50" />
</body>
相應的定位代碼如下:
string filePath = @"C:\類和對象.jpg";
driver.FindElement(By.Id("fileUpload")).SendKeys(filePath);
在以上的代碼里面,直接將上傳的文件路徑寫成絕對路徑了,這樣做靈活性不夠,擴展性較差,并不推薦。建議在做測試的時候,將測試文件放在測試項目里面,這樣我們就可以使用相對路徑來選擇文件。示例代碼如下:
string filPath = MyClass.GetFilePath() + @"testData\類和對象.jpg";
driver.FindElement(By.Id("fileUpload")).SendKeys(filePath);
JavaScript彈出窗口
JavsScript彈出窗口是通過使用Javascript創(chuàng)建,主要用來確認操作和提示消息。一種常見的彈出框如下所示:

13-2 彈出窗口示例.jpg
HTML源碼如下:
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title></title>
</head>
<script type="text/javascript">
function show_confirm()
{
var r = confirm("請點擊");
}
</script>
</head>
<body>
請選擇上傳文件: <input type="file" name="fileUpload" id="fileUpload" size="50" />
<br /><br />
<input type="button" onclick="show_confirm()" value="顯示確認對話框" />
</body>
</html>
定位示例代碼:
- 方法一:使用Selenium API中的IAlert接口
driver.FindElement(By.XPath("http://input[@value='顯示確認對話框']")).Click();
IAlert alert = driver.SwitchTo().Alert();
if (alert.Text.Contains("請點擊"))
{
alert.Accept();
}
else
{
alert.Dismiss();
}
- 方法二:使用JavaScript
((IJavaScriptExecutor)driver).ExecuteScript("window.confirm=function(){return true;}");
((IJavaScriptExecutor)driver).ExecuteScript("window.alert=function(){return true;}");
((IJavaScriptExecutor)driver).ExecuteScript("window.prompt=function(){return true;}");
driver.FindElement(By.XPath("http://input[@value='顯示確認對話框']")).Click();
模態(tài)對話框
隨著JavaScript的發(fā)展,出現一些非常靈活易用的JavaScript庫,如Bootstrap,這些JavaScript庫逐漸替換了Javascript默認的提示框。一種典型的對話框如下所示:

13-4 模態(tài)對話框示例_c2i.jpg
相比較好于原生態(tài)的JavaScript提示框,對于模態(tài)對話框,寫測試腳本要容易很多,示例代碼如下:
driver.FindElement(By.Id("modalpopup")).Click();
Thread.Sleep(500);
driver.FindElement(By.XPath("http://button[contains(@class,'btn btn-default')]")).Click();
設定超時時間
在測試過程中,彈出窗口未及時處理,將導致測試失敗。對于這種情況,我們通過給測試方法添加屬性TimeoutAttribute來指定最長的時間。
[TestMethod]
[Timeout(10*1000)] //超時時間為10秒
public void TestModalPopUp()
{
//實現代碼
}
在執(zhí)行用例時,如果超出設定的時間,會出現以下報錯
Test 'TestModalPopUp' exceeded execution timeout period.