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
添加回答
舉報