我想实现自己的By
类,以便拥有自定义选择器。使用自定义选择器的优缺点是什么
DEV代码
<button class="btn js-AddNuts" type="button" testid="addbutton">
此处选择器为testid
原因:我们计划为DEV代码中的所有元素设置测试特定选择器和设计名称,以便在DEV中更改任何内容时不会影响测试。
答案 0 :(得分:1)
在这种情况下无需创建自定义定位器(或者我遇到或可以想到的任何情况)。您只需使用以下使用CSS选择器的代码即可。
By.cssSelector("button[testid='addbutton']")
我建议您花一些时间阅读和学习CSS选择器。它们非常强大。
答案 1 :(得分:0)
如您所知,创建自己的定位器没有问题,Selenium提供了创建自定义定位器的功能。当您要查找元素By.id
,By.name
等时,内部使用selenium来使用xPath
定位元素。因此,您可以通过扩展By
类来创建自己的定位器。
如果你想创建一个使用testid
定位元素的自定义定位器,你应该创建如下(假设你使用的是java): -
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.SearchContext;
import org.openqa.selenium.WebElement;
class ByTestId extends By {
private final String testId;
public ByTestId(String testId) {
this.testId = testId;
}
@Override
public List<WebElement> findElements(SearchContext context) {
return context.findElements(By
.xpath(".//*[@testid = '"+testId+"']"));
}
@Override
public WebElement findElement(SearchContext context) {
return context.findElement(By
.xpath("//*[@testid = '"+testId+"']"));
}
}
现在,您可以使用testid
轻松找到元素,如下所示: -
//for single webelement
WebElement element = driver.findElement(new ByTestId("addbutton"));
//for list of webelements
List<WebElement> elements = driver.findElements(new ByTestId("addbutton"));
注意:您还可以使用By
将自定义By.cssSelector
课程中的元素定位为:By.cssSelector("*[testid = '"+testId+"']")
希望它有所帮助.. :)