頁面元素中的ID這東西想必很多人都用過,在JavaScript函數中也經常要用到 document.getElementById()這個方法來定位一個元素並操作它。在Web自動化測試中,我們也經常用到元 素的id來定位元素,這樣看起來id是個好玩意兒。
在之前的一篇文章Selenium IDE實踐中,Selenium錄制的腳本中有下面這一段代碼:
[Test]
public void TheNewTest()
{
selenium.Open("http://www.google.cn/");
Assert.AreEqual("Google", selenium.GetTitle());
selenium.Type("q", "Selenium 介紹");
selenium.Click("btnG");
selenium.WaitForPageToLoad("30000");
Assert.AreEqual("Selenium 介紹 - Google 搜索", selenium.GetTitle());
try
{
Assert.IsTrue(selenium.IsTextPresent("圖片、新聞搜索"));
}
catch (AssertionException e)
{
verificationErrors.Append(e.Message);
}
}
注意Aaron做了標記的那兩行的兩個方法,Selenium.Type()方法顧名思義是向某個控件輸入內容的 ,看著Aaron的例子應該會明白第二個參數是輸入的內容,那麼第一個參數想必是控件的屬性了。對,第 一個控件是google搜索頁面那個我們經常使用的輸入框,如果我們用IE Developer Toolbar來查看該文本 輸入框,可以看到下面的內容:
<input title="Google 搜索" maxLength="2048" size="55" name="q" autocomplete="off"/>
同樣我們Selenium.Click的btnG則是Google頁面上那個“Google Search”按鈕的name
<input title="Google Search" maxLength="2048" size="55" name="q" autocomplete="off"/>
這裡面google使用的是元素的name屬性,對應於document.getElementsByName()方法,也是定位元素 的一種方法。下面問題來了,Name與ID有什麼關系呢?
話說表單的name與id其實是同一個意思,都是為了標記對象名稱。它們所不同的是:name是Netscape 的、id是Microsoft的,這種說法到底准不准確我們暫且不論,我們更關心的是怎麼用好這兩個東西。
有總結如下:
Name用作表單(form)的控件名,提交的數據都用控件的name而不是id來控制。因為有許多name會同 時對應多個控件,比如checkbox和radio,而id必須是全文檔中唯一的。此外浏覽器會根據name來設定發 送到服務器的request。如果用id,服務器無法得到數據的。Name還可以用於在其他frame或window指定 target。對於name來講,它有很多用途,不能完全由ID來代替。關於name的用途相關內容建議參看文末引 用1原帖及帖下的熱烈討論。
ID:根據HTML 4.0 的定義,除 BASE, HEAD, HTML, META, SCRIPT, STYLE, TITLE 標簽外,id 都可用, 包括了Body li a table tr td th p div span pre dl dt dd font b等.另外asp.net進程在處理aspx頁 面時不允許有ID非唯一,這時頁面會拋出異常。