2016-02-22 19 views
-1

我想使定位器在driver.findElement(####)中是通用的。這意味着我可以使用不同的定位器,如By.IdBy.NameBy.Xpath等...來定位特定元素。如何使driver.findelement爲Selenium中不同定位器的通用?

我該如何將此作爲通用語句?

+0

你並不需要所有這些「發現者」......你只能使用「By.Xpath」。例如,如果你有元素的'id'或'name',你可以通過'xpath'找到元素 - ''//元素[@ id =「element's id」]'''''元素[@ name =「元素的名字「]」' – Andersson

+0

感謝你們倆。我在重複問題,可能是我讓你困惑。在我的應用程序發佈期間,我不得不將id更改爲xpath或類名稱或標記。所以我不能使用像driver.findElement(By.id())這樣的元素選擇方法。 在下一個構建中,我可能必須使用driver.findElement(By.xpath())或driver.findElement(By.name())作爲相同的元素位置。這意味着我將不得不訪問我編寫的每個類文件並將By.id()修改爲相應的選擇器。 有沒有辦法通過參數化或其他方式來解決這個問題? – Kumar

回答

0

我在你的問題下面閱讀了評論,並認爲我知道你要達到的目標,因爲我在C#中爲我的項目做了類似的事情。我們的系統在多個分支上進行測試,並且在這些分支上,我們有需要不同元素定位器的部分,在一個分支上,我們使用XPath,在另一個分支上使用類選擇器,您就明白了。

爲了避免您所描述的問題,必須通過整個項目並在更改分支/釋放時替換所有這些選擇器,我將所有選擇器移至一系列類中。這裏是一個例子:

假設我想單擊後退按鈕。在分支A上,該按鈕位於By.Id("My-Back-Button")。在分行B上,該按鈕位於By.CssSelector(".take.me.back")

首先,我將創建一個名爲Selectors的抽象類,它將定義一個名爲public By BackButton()之類的抽象方法。然後我會創造的SelectorsBranchABranchB 2個類這將覆蓋的方法BackButton

// Within BranchA : Selectors 
@override 
public By BackButton() { return By.Id("My-Back-Button"); } 

// Within BranchB : Selectors 
@override 
public By BackButton() { return By.CssSelector(".take.me.back"); } 

的最後一步是將有一個工廠類,將決定你需要哪個分支。在我的解決方案中,我有一個XML配置文件,可以通過此工廠類讀取以確定要使用哪個類,但在您的情況下,靜態bool可能已足夠。

這個工廠類,SelectorFactory將有一個名爲public Selectors Get()方法會使用一些情況下,/開關/如果來創建所需的子類的新實例Selector

最終的解決方案將是如下:

// During development 
Driver.FindElement(SelectorFactory.Get().BackButton()).Click(); 
// Clicks By.Id("My-Back-Button"); 

// During release 
Driver.FindElement(SelectorFactory.Get().BackButton()).Click(); 
// Clicks By.CssSelector(".take.me.back"); 

希望幫助!

+0

我不確定C#代碼。請在Java中提供相同的解決方案。提前致謝。 – Kumar

相關問題