Java 如何使driver.findelement成为Selenium中不同定位器的通用?
我想使定位器在Java 如何使driver.findelement成为Selenium中不同定位器的通用?,java,selenium,selenium-webdriver,Java,Selenium,Selenium Webdriver,我想使定位器在driver.findElement(#####)中是通用的。这意味着我可以使用不同的定位器,如By.Id或By.Name或By.Xpath等。。。定位特定的元素 我怎样才能把这句话作为一般性的陈述呢?我读了你问题下面的评论,我想我知道你想要实现什么,因为我在C#中的项目中也做了类似的事情。我们的系统在多个分支上进行测试,在这些分支上,我们有需要不同元素定位器的部分,在一个分支上,我们使用XPath,在另一个分支上,我们使用类选择器,您明白了 为了避免您描述的在更改分支/发布时必须
driver.findElement(#####)中是通用的
。这意味着我可以使用不同的定位器,如By.Id
或By.Name
或By.Xpath
等。。。定位特定的元素
我怎样才能把这句话作为一般性的陈述呢?我读了你问题下面的评论,我想我知道你想要实现什么,因为我在C#中的项目中也做了类似的事情。我们的系统在多个分支上进行测试,在这些分支上,我们有需要不同元素定位器的部分,在一个分支上,我们使用XPath,在另一个分支上,我们使用类选择器,您明白了 为了避免您描述的在更改分支/发布时必须遍历整个项目并替换所有这些选择器的问题,我将所有选择器移动到一系列类中。以下是一个例子: 假设我想点击后退按钮。在分支
A
上,此按钮位于by.Id(“我的后退按钮”)
。在分支B
上,此按钮位于.CssSelector(“.take.me.back”)的旁
首先,我将创建一个名为Selectors
的抽象类,它将定义一个名为public By BackButton()
的抽象方法。然后我将创建两个子类选择器
,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
创建所需子类的新实例
最终解决办法如下:
// 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");
希望有帮助 你其实不需要这些“发现者”。。。只能通过.Xpath使用。例如,如果您有元素的id
或name
,您可以通过xpath
-'//element[@id=“element's id”]'
或'//element[@name=“element's name”]
找到元素,感谢你们两位。我在重复这个问题,可能是我把你们弄糊涂了。在发布期间的应用程序中,我被迫将id更改为xpath或类名或标记。所以我不能使用任何元素选择方法,比如driver.findElement(By.id())。在下一个构建中,我可能必须对相同的元素位置使用driver.findElement(By.xpath())或driver.findElement(By.name())。这意味着我必须访问我编写的每个类文件,并通过.id()修改相应的选择器。有没有办法通过参数化或其他方法来避免这个问题?我不确定C代码。请用Java提供相同的解决方案。提前谢谢。