如何在范围报告中打印WebElement变量名称?

时间:2019-02-28 21:34:34

标签: java selenium selenium-webdriver extentreports

最终目的是获取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
    }

2 个答案:

答案 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