我想在WebElement
方法的ITestListener
类中获得TestFailure
。
是否可以通过WebElement
方法在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
答案 0 :(得分:1)
我认为有两件事应该引起注意:
当涉及到元素时,WebDriver中的故障有两种(除了与单独加载浏览器有关的故障)。
因此,并非所有故障都将具有与之关联的WebElement。 一旦获得WebElement,就无能为力了(获取屏幕截图是很好的,但是当屏幕上没有任何信息时,该屏幕快照可以做的有什么用)
总而言之,要完成您所追求的,您需要满足以下条件:
org.openqa.selenium.support.events.AbstractWebDriverEventListener
或通过实现接口org.openqa.selenium.support.events.WebDriverEventListener
构建的实现org.openqa.selenium.support.events.EventFiringWebDriver
的测试代码
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
开头,因此我可以使用驱动程序对象进行屏幕截图或执行任何其他操作。