2013-07-03 96 views
9

在我們當前的自動化(使用Selenium/WebDriver/Java)中,我們廣泛使用@FindBy非常。例如:使用,ID,名稱,類名,CSS,標記名LINKTEXT,partialLinkText和XPath:查找WebElements,最佳實踐

@FindBy(css="a[name='bcrumb']") protected List<WebElement> breadCrumbLinks; 
@FindBy(id="skuError")   protected WebElement skuError; 
@FindBy(className="reducedPrice") protected List<WebElement> reducedPrice; 
@FindBy(partialLinkText="Injinji RUN 2.0") protected WebElement playButton; 
@FindBy(linkText="annual member refund") protected WebElement annualMemberRefund; 
@FindBy(xpath="//li[@itemprop='price']") protected WebElement productPrice; 

根據定義,@FindBy可以使用下面的定位的選擇器。

最近,我們的前端開發人員建議我們實現一個以'test ='開頭的新屬性類。我認爲這是一個好主意,因爲我們可以通過查找文本的blurb而不是@FindBy內在使用的值來找到WebElements。我的問題是,擴展現有功能@FindBy是否會更好?或者,創建一種搜索我們在測試中使用的WebElements的新方法?

回答

12

首先,沒有「最佳實踐」,只有那些在您的特定環境中運作良好的「最佳實踐」。對不起,這是我的一個老... ...

我不會花費自定義屬性的努力,除非你不能使用現有的方法。我更喜歡在可能的情況下使用現有的定位器(查找邏輯)。

只要有可能,請使用ID屬性。如果頁面是有效的HTML,那麼頁面上的ID是唯一的。它們在每個瀏覽器中的分辨率都非常快,並且UI可以發生顯着變化,但腳本仍然會找到該元素。

有時ID不是正確的選擇。當您使用類似網格控件的東西時,動態生成的ID幾乎總是錯誤選擇。你依賴於一個可能與特定行位相關的id,然後當你的行發生改變時你就被搞砸了。

在某些情況下,您的開發人員可以通過將動態生成的ID值附加或預先添加常量值來幫助您解決問題。 ASP.NET Webforms使用動態生成的值做了一些瘋狂的事情,所以我多次使用後綴對我有所幫助。

當您無法獲得穩定,可靠的ID或者只是不可用時,鏈接文本,名稱屬性值和CSS選擇器(JQuery樣式)是很好的第二選擇。

XPath是我在幾乎所有情況下的最後選擇。它很慢,可能非常脆弱,並且在複雜的XPath時很難處理。也就是說,如果您需要在您的定位器的頁面DOM上下移動,那麼它是唯一的選擇。

使用現有的FindBy方法之一意味着您將使用一個廣爲人知的,支持良好的定位器策略。當你試圖找出一箇舊的測試,或者讓一個新加入你的團隊的人加入時,這是一個很大的好處。

這是我的0.02美元。

+1

那麼說,吉姆。這是我的答案。 – Brian

1

如果我正確理解了你的話,你可以繼續使用@FindBy註釋和css選擇器,比如css =「[test ='...']」。

+0

是的,我知道。我的具體問題是,擴展FindBy或創建一個新的類可以處理不符合當前FindBy約定的屬性/元素的搜索。 – Brian

4

我認爲這將有助於Selenium Locators Best Practices

鮮美定位器: ID 名稱 類 鏈接 文字或部分文字

美味定位器 指數 的XPath 子元素 CSS屬性 食用定位器 JS Events DOM Elements KeyStrokes 座標

+0

錯誤的HTML鏈接。你能更新嗎? – djangofan

+2

嘗試此[鏈接](http://3qilabs.com/2012/02/best-practices-for-watir-and-selenium-locators-the-locator-tree-of-life/)或只是谷歌查詢「最好對Watir和硒定位器的實踐 - 定位器生命樹「 – Stormy

+0

鏈接被移動[有](http://3qilabs.com/best-practices-for-watir-and-selenium-locators-the-locator-tree-壽命/) –