最终目标是获取用于报告目的的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=‘登录菜单’//atext()=‘登录’]
此外,我还想在WebDriverEventListener中使用afterClickOn(WebElement element,WebDriver driver)方法在扩展报告中打印相同的所需输出驱动程序。
我创建框架的方式是,根据需要在范围报告中打印WebDriverEventListener结果,但是无法如上所述打印所需的输出。
如果我在上面的代码中遗漏了什么,并在WebDriverEventListener的afterClickOn(WebElement element,WebDriver驱动程序)方法中实现相同的功能,请告知
下面是事件监听器afterClickmethod
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
}
发布于 2019-03-01 06:07:38
我不相信有一种直接的方法可以获得您为元素指定的名称(比如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
发布于 2020-10-22 04:10:02
但对于那些将遇到同样问题的人来说,这是一个老问题。一种可能的解决方案是扩展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
harness顺利集成。
这是循序渐进的tutorial。
https://stackoverflow.com/questions/54934639
复制相似问题