如何在ItestListener中获取WebElement

时间:2019-06-20 09:03:51

标签: java selenium-webdriver testng listener

我想在WebElement方法的ITestListener类中获得TestFailure

是否可以通过WebElement方法在ItestListener中获得testfailure

我尝试获取testclasstestmethod的名称,并且有效,但是如何获取WebElement

// WebElement inputbox i need this in ItestListener
public void test1() {
  String title = driver.getTitle();
  String etitle = "Google1";
  WebElement inputbox = driver.findElement(By.id("fakebox-input1"));
  inputbox.click();
  Assert.assertEquals(title, etitle);
}
// my Listener class 
public void onTestFailure(ITestResult iTestResult) {
  System.out.println("Test failed >.......");
  String classname = iTestResult.getInstanceName(); // class name
  this.driver = demo.driver;
  System.out.println(iTestResult.getName()); // test method name
  CaptureScreenShot cs = new CaptureScreenShot();
  cs.takescreenshotoferror(iTestResult.getName(), driver);
}

我可以使用以下命令在testfailure上获得类名和方法名:

get
webelement

2 个答案:

答案 0 :(得分:1)

我认为有两件事应该引起注意:

当涉及到元素时,WebDriver中的故障有两种(除了与单独加载浏览器有关的故障)。

  1. 无法找到特定元素。
  2. 成功找到元素后无法对其进行某些操作。

因此,并非所有故障都将具有与之关联的WebElement。 一旦获得WebElement,就无能为力了(获取屏幕截图是很好的,但是当屏幕上没有任何信息时,该屏幕快照可以做的有什么用)

总而言之,要完成您所追求的,您需要满足以下条件:

  1. 通过扩展org.openqa.selenium.support.events.AbstractWebDriverEventListener或通过实现接口org.openqa.selenium.support.events.WebDriverEventListener构建的实现
  2. 使用org.openqa.selenium.support.events.EventFiringWebDriver的测试代码
    1. 一个TestNG侦听器,该侦听器实现org.testng.ITestListener来跟踪故障的发生时间和发生时间。

下面是一个示例,显示了所有这些操作

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.events.AbstractWebDriverEventListener;
import org.testng.ITestResult;
import org.testng.Reporter;

public class LocalEventListener extends AbstractWebDriverEventListener {

  @Override
  public void afterFindBy(By by, WebElement element, WebDriver driver) {
    ITestResult result = Reporter.getCurrentTestResult();
    result.setAttribute("CurrentElement", element);
  }
}
import org.openqa.selenium.WebElement;
import org.testng.ITestListener;
import org.testng.ITestResult;

public class TestNGLocalListener implements ITestListener {

  @Override
  public void onTestFailure(ITestResult result) {
    Object object = result.getAttribute("CurrentElement");
    if (object == null) {
      return;
    }

    WebElement element = (WebElement) object;
    System.err.println("The element that caused the failure is " + element.toString());
  }
}
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.events.EventFiringWebDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;

@Listeners(TestNGLocalListener.class)
public class SampleTestClass {
  private EventFiringWebDriver driver;

  @BeforeClass
  public void setup() {
    driver = new EventFiringWebDriver(new ChromeDriver());
    driver.register(new LocalEventListener());
  }

  @Test
  public void testMethod() {
    driver.get("https://the-internet.herokuapp.com/checkboxes");
    WebElement checkbox = driver.findElement(By.xpath("//input[@type='checkbox']"));
    driver.executeScript("arguments[0].blah.blah", checkbox);
  }

  @AfterClass
  public void cleanup() {
    if (driver != null) {
      driver.quit();
    }
  }
}

答案 1 :(得分:0)

您可以扩展在ITestListener中初始化驱动程序的类。

我建议您创建一个单独的Listener类,该类将扩展您的Base Class(在其中初始化驱动程序)并实现ITestListener。

类似这样的东西:

 public class ReportListener extends BaseClass implements ITestListener 

我的驱动程序用BaseClass开头,因此我可以使用驱动程序对象进行屏幕截图或执行任何其他操作。