2 回答

TA贡献1906条经验 获得超10个赞
老问题,但对于那些会遇到同样问题的人。一种可能的解决方案是扩展ElementLocator(例如DefaultElementLocator)您将在findBy()方法中记录元素名称的位置。喜欢:
public class WECElementLocator extends DefaultElementLocator {
final String UNNAMED = UUID.randomUUID().toString();
final String elementName;
public WECElementLocator(SearchContext searchContext, Field field) {
super(searchContext, field);
Name elementNameAnnotated = field.getAnnotation(Name.class);
if (elementNameAnnotated != null){
elementName = elementNameAnnotated.value();
}else{
elementName = UNNAMED;
}
}
private void log(String message){
if(!UNNAMED.equals(elementName)){
System.out.println(message + " (for [" + elementName + "])");
}
}
@Override
public WebElement findElement() {
try{
log("Attempt to lookup element..");
WebElement result = super.findElement();
log("Element successfully located.");
return result;
}catch (Throwable e){
log("Problem in locating element..");
throw e;
}
}
}
您可以引入自己的注释,该注释将为您的字段分配一个人类可读的名称。喜欢:
public class PageObjectWithName {
@Name("My test name")
@FindBy(xpath = "//input[@type='button']")
WebElement button;
public PageObjectWithName(SearchContext context) {
// TODO: implement page initialization
}
public void clickButton(){
button.click();
}
}
因此,在初始化部分,您将只使用元素定位器的自定义实现,它将获取注释并使用字段中的名称。不需要额外的反射工作。这将与PageFactory线束顺利集成。

TA贡献1821条经验 获得超6个赞
我不相信有一种简单的方法可以获取您为元素提供的名称(例如 getName() 方法)。我能想到的最接近的事情是执行以下操作:
public class ElementNaming {
//Create a hashmap that stores the name of the element as a string
public static HashMap<WebElement, String> webElementKeys = new HashMap<>();
public static By by = By.id("hplogo");
public static WebElement instantiateWebElementAndName(String name, By by) {
webElementKeys.put(driver.findElement(by), name);
return driver.findElement(by);
}
public static void main(String[]args) {
driver.get("https://www.google.com/");
WebElement element = instantiateWebElementAndName("element", by);
System.out.println("Element name: " + webElementKeys.get(element));
}
}
Console Output:
Element name: element
添加回答
举报