Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使driver.findelement成为Selenium中不同定位器的通用?_Java_Selenium_Selenium Webdriver - Fatal编程技术网

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提供相同的解决方案。提前谢谢。