Как получить WebElement в ItestListener - PullRequest
1 голос
/ 20 июня 2019

Я хочу получить класс WebElement in ITestListener для метода TestFailure.

Есть ли способ получить метод WebElement in ItestListener для testfailure?

Я пытался получить имя testclass и testmethod, и это сработало, но как получить 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 ]

1 голос
/ 21 июня 2019

Я подумал, что мне следует вызвать пару вещей:

Сбои в 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
  3. Слушатель 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();
    }
  }
}
0 голосов
/ 20 июня 2019

Вы можете расширить класс, в котором ваш драйвер инициализирован, в вашем ITestListener.

Я бы посоветовал вам создать отдельный класс Listener, который расширит ваш базовый класс (там, где инициализируется драйвер) и реализует ITestListener.

Примерно так:

 public class ReportListener extends BaseClass implements ITestListener 

Мой драйвер инициализирован в BaseClass, поэтому я могу использовать объект драйвера для создания снимка экрана или выполнения любых других операций.

...