Прослушивание скриншота в селене с TestNG
У меня есть тестовый сценарий, который будет вызывать драйвер как нестатическую переменную. Я также добавил слушателя скриншота в моем тестовом случае. Когда тестовый случай не проходит, элемент управления автоматически отправляется на прослушиватель снимков экрана, однако, поскольку мой драйвер представляет собой переменную NAT-STATIC, он не может быть доступен в прослушивателе снимков экрана. Поэтому я получаю исключение nullpointer.
Чтобы решить эту проблему, я создал простой базовый тестовый класс с помощью stackru, как показано ниже, и расширил его в каждом тестовом классе.
public asbtract baseTest() {
private WebDriver driver;
public WebDriver getDriver() {
return driver;
}
@BeforeMethod
public void createDriver() {
Webdriver driver=XXXXDriver();
}
@AfterMethod
public void tearDownDriver() {
if (driver != null)
{
try
{
driver.quit();
}
catch (WebDriverException e) {
System.out.println("***** CAUGHT EXCEPTION IN DRIVER TEARDOWN *****");
System.out.println(e);
}
}
}
В моем слушателе я получаю доступ к базовому классу следующим образом
public class ScreenshotListener extends TestListenerAdapter {
@Override
public void onTestFailure(ITestResult result)
{
Object currentClass = result.getInstance();
WebDriver webDriver = ((baseTest) currentClass).getDriver();
if (webDriver != null)
{
File f = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);
//etc.
}
}
Мой тестовый класс выглядит так
@Listeners(value = FailureReport.class)
public class LoginTest extends baseTest{
Login login = new Login(getDriver());
@Test(description = "Verify Expand the Menu", priority = 0)
public void navigateloginpage() {
login.expandMenuScreenLogin();
login.navigateLoginPage();
}
@Test(description = "User login Sucessfully", priority = 1)
public void successLogin() {
login.login();
}
Когда я запускаю это, это дает мне ошибку
org.testng.TestNGException:
Cannot find class in classpath: com.fbf.automation.tests.LoginTest
at org.testng.xml.XmlClass.loadClass(XmlClass.java:81)
at org.testng.xml.XmlClass.init(XmlClass.java:73)
at org.testng.xml.XmlClass.<init>(XmlClass.java:59)
at org.testng.xml.TestNGContentHandler.startElement(TestNGContentHandler.java:548)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(XMLDTDValidator.java:745)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1359)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2784)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:841)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:770)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:327)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:195)
at org.testng.xml.XMLParser.parse(XMLParser.java:38)
at org.testng.xml.SuiteXmlParser.parse(SuiteXmlParser.java:16)
at org.testng.xml.SuiteXmlParser.parse(SuiteXmlParser.java:9)
at org.testng.xml.Parser.parse(Parser.java:172)
at org.testng.TestNG.initializeSuitesAndJarFile(TestNG.java:302)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:45)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
Process finished with exit code 0
Позже, когда я изменил свой тестовый класс следующим образом, он работал правильно
@Listeners(value = FailureReport.class)
public class LoginTest extends baseTest{
Login login;
@Test(description = "Verify Expand the Menu", priority = 0)
public void navigateloginpage() {
login = new Login(getDriver());
login.expandMenuScreenLogin();
login.navigateLoginPage();
}
@Test(description = "User login Sucessfully", priority = 1)
public void successLogin() {
login.login();
}
Разве нельзя объявить код
login = new Login(getDriver());
вне метода @test вместо того, чтобы писать его внутри метода @test. Или есть ли другие альтернативные способы, которыми я могу назвать приведенный выше код
1 ответ
Вы можете создать объект Login внутри метода @BeforeClass
@BeforeClass(alwaysRun = true)
public void setUp() throws Exception {
login = new Login(getDriver());
}