Я подумал, что мне следует вызвать пару вещей:
Сбои в WebDriver бывают двух типов (кроме сбоев, связанных с загрузкой браузера самостоятельно), когда речь идет об элементах.
- Невозможно найти конкретный элемент.
- Невозможно выполнить какую-либо операцию с элементом после его успешного поиска.
Так что нетвсе сбои будут иметь связанный с ними WebElement.Как только вы получите WebElement, с ним мало что можно сделать (снимок экрана - это хорошо, но чем хорош этот снимок, если на нем нет информации на странице, где он появился)
Все сказано и сделано, чтобы выполнить то, что вам нужно, вам нужно следующее:
- Реализация, которая создается путем расширения
org.openqa.selenium.support.events.AbstractWebDriverEventListener
или путем реализации интерфейса org.openqa.selenium.support.events.WebDriverEventListener
- Тестовый код, который использует
org.openqa.selenium.support.events.EventFiringWebDriver
- Слушатель 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();
}
}
}