我想在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.Id
或By.Name
等不同的定位器来定位特定元素。
如何将此作为通用声明?
答案 0 :(得分:0)
我阅读了你问题下面的评论,并认为我知道你想要实现的目标,因为我在C#中为我的项目做了类似的事情。我们的系统在多个分支上进行测试,在这些分支上我们有需要不同元素定位器的部分,在一个分支上,我们使用XPath,在另一个分支上我们使用类选择器,你就明白了。
为了防止您在更改分支/释放时所描述的必须完成整个项目并替换所有这些选择器的问题,我将所有选择器移动到一系列类中。这是一个例子:
假设我想点击后退按钮。在分支A
上,此按钮位于By.Id("My-Back-Button")
旁边。在分支B
上,此按钮位于By.CssSelector(".take.me.back")
。
首先,我将创建一个名为Selectors
的抽象类,它将定义一个名为public By BackButton()
的抽象方法。然后我会创建2个Selectors
,BranchA
和BranchB
的子类,它们将覆盖方法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");
希望有所帮助!