最终目的是获取WebElement变量名称以用于报告。
下面是我的代码。
A级:
Class A{
public void Click(WebElement element)
{
element.click();
System.out.println("Clicked on"+ element);
}
}
B级:
class B extends A{
@FindBy(xpath = "//li[@class='login-menu']//a[text()='Log In']")
WebElement link_Log_In;
Click(link_Log_In);
}
所需的输出:
点击link_Log_In
实际输出:
点击了[[ChromeDriver:XP上的chrome(acc46d4d382511d7b18396d4a4dddd30)]-> xpath:// li [@ class ='login-menu'] // aa [text()='Login']]
我还想使用WebDriverEventListener中的afterClickOn(WebElement元素,WebDriver驱动程序)方法在范围报告中打印相同的所需输出。
我以这样的方式创建了框架:WebDriverEventListener结果可根据需要在范围报告中打印,但是如上所述无法打印所需的输出。
请告知我上述代码中是否缺少某些内容,并在WebDriverEventListener中的afterClickOn(WebElement元素,WebDriver驱动程序)方法中实现相同目的
下面是Click方法之后的事件监听器
public void afterClickOn(WebElement element, WebDriver driver) {
System.out.println("Clicked On"+element); // this is to print in console
ExtentManager.getTest().log(Status.valueOf(element), "clicked on"); // this is to print in extent report
}
答案 0 :(得分:0)
我不认为有一种直接的方法来获取您赋予元素的名称(例如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
答案 1 :(得分:0)
旧问题,但对于那些将遇到相同问题的人。一种可能的解决方案是扩展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
线束顺利集成。
这是分步进行的tutorial。