首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何打印范围报表中的WebElement变量名?

如何打印范围报表中的WebElement变量名?
EN

Stack Overflow用户
提问于 2019-03-01 05:34:34
回答 2查看 874关注 0票数 1

最终目标是获取用于报告目的的WebElement变量名。

下面是我的代码。

A类:

代码语言:javascript
复制
Class A{

      public void Click(WebElement element)
      {
            element.click();
            System.out.println("Clicked on"+ element);
      }
}

B类:

代码语言:javascript
复制
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=‘登录菜单’//atext()=‘登录’]

此外,我还想在WebDriverEventListener中使用afterClickOn(WebElement element,WebDriver driver)方法在扩展报告中打印相同的所需输出驱动程序。

我创建框架的方式是,根据需要在范围报告中打印WebDriverEventListener结果,但是无法如上所述打印所需的输出。

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

下面是事件监听器afterClickmethod

代码语言:javascript
复制
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
    }
EN

回答 2

Stack Overflow用户

发布于 2019-03-01 06:07:38

我不相信有一种直接的方法可以获得您为元素指定的名称(比如getName()方法)。我能想到的最接近的事情就是做一些类似如下的事情:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2020-10-22 04:10:02

但对于那些将遇到同样问题的人来说,这是一个老问题。一种可能的解决方案是扩展ElementLocator (例如DefaultElementLocator),您将在findBy()方法中记录元素名称。像这样:

代码语言:javascript
复制
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;
        }
    }
}

您可以引入自己的注释,它将为您的字段指定一个人类可读的名称。像这样:

代码语言:javascript
复制
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 harness顺利集成。

这是循序渐进的tutorial

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54934639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档