【问题标题】:How to print the WebElement variable name in Extent Report?如何在范围报告中打印 WebElement 变量名称?
【发布时间】:2019-07-22 21:31:07
【问题描述】:

最终目标是获取 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: chrome on XP (acc46d4d382511d7b18396d4a4dddd30)] -> xpath: //li[@class='login-menu']//a[text()='Log In']]

我还想使用 WebDriverEventListener 中的 afterClickOn(WebElement element, WebDriver driver) 方法在范围报告中打印相同的 Desired Output

我已经创建了这样一种框架,即 WebDriverEventListener 结果根据需要打印在范围报告中,但无法如上所述打印所需的输出。

如果我在上面的代码中遗漏了什么,并在 WebDriverEventListener 的 afterClickOn(WebElement element, WebDriver driver) 方法中实现相同的功能,请告知

下面是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
    }

【问题讨论】:

  • 你能展示你用来写webelement来扩展报告的方法吗,基本上这是因为你试图用字符串写一个对象。
  • 不,这不是 Java 反射的重复:如何获取变量的名称?使用 Java 反射我们无法实现所需的输出
  • @AmitJain 我已经在事件监听器中使用 afterclickmethod 更新了代码,这将帮助您回答我的问题。非常感谢您的帮助。实际上,我因此而陷入困境。
  • @Hari 日志方法接受 LogStatus 和字符串,您如何传递 WebElement,您能否显示您在日志方法的 param1 中使用的“状态”和 valueOf 方法是什么? valueOf 是一个 String 类方法。

标签: java selenium selenium-webdriver extentreports


【解决方案1】:

我认为没有一种直接的方法可以获取您为元素指定的名称(例如 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

【讨论】:

  • 请帮助我了解即使您没有将值放入哈希图中,控制台中的“元素”是如何打印的?
  • 因此,如果您查看 instantiateWebElementAndName,我会将 driver.findElement 返回的实际对象和字符串名称放入哈希图中。然后该方法返回找到的对象,以便可以将其分配给在主方法中看到的元素。
【解决方案2】:

老问题,但对于那些会遇到同样问题的人。一种可能的解决方案是扩展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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-11
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 2018-01-18
    相关资源
    最近更新 更多