如何在Selenium中将driver.findelement设为通用的不同定位器?

时间:2016-02-22 12:05:22

标签: java selenium selenium-webdriver

我想在using (var session = DocumentStoreHolder.Store.OpenSession()) { for (int i = 0; i < count; i++) { var doc = session.Load<Book>(i); Console.WriteLine(doc); } } 中使定位器具有通用性。这意味着我可以使用driver.findElement(####)By.IdBy.Name等不同的定位器来定位特定元素。

如何将此作为通用声明?

1 个答案:

答案 0 :(得分:0)

我阅读了你问题下面的评论,并认为我知道你想要实现的目标,因为我在C#中为我的项目做了类似的事情。我们的系统在多个分支上进行测试,在这些分支上我们有需要不同元素定位器的部分,在一个分支上,我们使用XPath,在另一个分支上我们使用类选择器,你就明白了。

为了防止您在更改分支/释放时所描述的必须完成整个项目并替换所有这些选择器的问题,我将所有选择器移动到一系列类中。这是一个例子:

假设我想点击后退按钮。在分支A上,此按钮位于By.Id("My-Back-Button")旁边。在分支B上,此按钮位于By.CssSelector(".take.me.back")

首先,我将创建一个名为Selectors的抽象类,它将定义一个名为public By BackButton()的抽象方法。然后我会创建2个SelectorsBranchABranchB的子类,它们将覆盖方法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()的方法,该方法将使用一些case / switch / if来创建所需子类的新实例Selector。 / p>

最终解决方案如下:

// 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");

希望有所帮助!