簡體   English   中英

如何在 ItestListener 中獲取 WebElement

[英]How to get WebElement in ItestListener

我想獲得WebElementITestListener階級TestFailure方法。

有沒有什么辦法讓WebElementItestListenertestfailure方法?

我試圖獲取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

您可以擴展在 ITestListener 中初始化驅動程序的類。

我建議您創建一個單獨的 Listener 類,該類將擴展您的基類(驅動程序初始化的位置)並實現 ITestListener。

像這樣的東西:

 public class ReportListener extends BaseClass implements ITestListener 

我的驅動程序在BaseClassBaseClass ,因此我可以使用我的驅動程序對象來截取屏幕截圖或執行任何其他操作。

我認為我應該指出以下幾點:

當涉及到元素時,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();
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM