为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

眼眸繁星 2022-07-14 16:19:43
最终目标是获取用于报告目的的 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) 方法中实现相同的功能下面是事件监听器 afterClick 方法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 回答

?
隔江千里

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线束顺利集成。


查看完整回答
反对 回复 2022-07-14
?
达令说

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


查看完整回答
反对 回复 2022-07-14
  • 2 回答
  • 0 关注
  • 61 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号