如何在使用java并行运行时将多个Selenium WebDriver会话日志写入不同的文件
正在寻找将Selenium webDriver脚本的执行详细信息逐步写入文件的解决方案。需要将日志添加到为testng.xml中的每个“测试”创建并在不同浏览器上运行的文件中。 通过实现WebDriverEventListener“一个会话”实现了这一点(但我不想在一个方法中将每个驱动程序实例自定义日志写入不同的文件) 但正在寻找一种解决方案,将每个“日志文件”与“Webdriver实例”绑定,并将各自的浏览器操作写入其中如何在使用java并行运行时将多个Selenium WebDriver会话日志写入不同的文件,java,selenium,selenium-webdriver,automation,testng,Java,Selenium,Selenium Webdriver,Automation,Testng,正在寻找将Selenium webDriver脚本的执行详细信息逐步写入文件的解决方案。需要将日志添加到为testng.xml中的每个“测试”创建并在不同浏览器上运行的文件中。 通过实现WebDriverEventListener“一个会话”实现了这一点(但我不想在一个方法中将每个驱动程序实例自定义日志写入不同的文件) 但正在寻找一种解决方案,将每个“日志文件”与“Webdriver实例”绑定,并将各自的浏览器操作写入其中 @Parameters({"BrowserName"}) @Be
@Parameters({"BrowserName"})
@BeforeTest
public void createDriver(String BrowserName) {
switch (BrowserName) {
case "Chrome":
System.setProperty("webdriver.chrome.driver",
System.getProperty("user.dir") + "//BrowserExes//chromedriver.exe");
Driver = new ChromeDriver();
eventFiringDriver = new EventFiringWebDriver(Driver);
eventListener = new CustomWebDriverListener(Driver);
eventFiringDriver.register(eventListener);
break;
case "IE":
System.setProperty("webdriver.ie.driver",
System.getProperty("user.dir") + "//BrowserExes//IEDriverServer.exe");
Driver = new InternetExplorerDriver();
eventFiringDriver = new EventFiringWebDriver(Driver);
eventListener = new CustomWebDriverListener(Driver);
eventFiringDriver.register(eventListener);
default:
break;
}
}
@Test
public void loadURL(){
eventFiringDriver.get("https://www.google.com");
}
我已经通过基于TestNG测试的数量实现ISuiteListener创建了报告文件
<suite name="Suite" parallel="tests">
<test name="Test">
<parameter name="BrowserName" value="Chrome"></parameter>
<classes>
<class name="eventFiringWebDriver.EventDriver"></class>
</classes>
</test>
<test name="Test_2">
<parameter name="BrowserName" value="IE"></parameter>
<classes>
<class name="eventFiringWebDriver.EventDriver"></class>
</classes>
</test>
如果依赖SLF4j之类的日志框架,您应该能够非常轻松地完成这项工作。 在较高的层次上,您需要利用SLF4j提供的
SiftingAppender
,并从代码中将值注入到logback.xml
中引用的变量中
我已经在我的博客文章中捕获了所有这些信息,并提供了一个示例
但为了便于参考,我在这篇文章中也包含了一些简单的要点
下面是我的logback.xml
的样子
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>fileName</key>
<defaultValue>defaultTest</defaultValue>
</discriminator>
<sift>
<appender name="FILE-${fileName}" class="ch.qos.logback.core.FileAppender">
<file>${fileName}.log</file>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{HH:mm:ss:SSS} | %-5level | %thread | %logger{20} | %msg%n%rEx</pattern>
</layout>
</appender>
</sift>
</appender>
<root level="ALL">
<appender-ref ref="SIFT"/>
</root>
</configuration>
下面是使用所有这些的测试用例的外观
public class ManyTestCases {
@Test
public void testMethod1() {
runTest("http://www.google.com");
}
@Test
public void testMethod2() {
runTest("http://www.yahoo.com");
}
private void runTest(String url) {
ChromeDriver cd = new ChromeDriver();
EventFiringWebDriver driver = new EventFiringWebDriver(cd);
LogAwareWebDriverEventListener listener = new LogAwareWebDriverEventListener();
String outputFolder = Reporter.getCurrentTestResult().getTestContext().getSuite().getOutputDirectory();
listener.bindLogName(Reporter.getCurrentTestResult().getName(), outputFolder);
driver.register(listener);
driver.get(url);
driver.quit();
listener.unbind();
}
}
Maven依赖项:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
</dependency>
回写
(参考此内容了解如何在SLF4j中使用多个鉴别器)
如果依赖于SLF4j之类的日志框架,您应该能够非常轻松地完成这项工作。
在较高的层次上,您需要利用SLF4j提供的SiftingAppender
,并从代码中将值注入到logback.xml
中引用的变量中
我已经在我的博客文章中捕获了所有这些信息,并提供了一个示例
但为了便于参考,我在这篇文章中也包含了一些简单的要点
下面是我的logback.xml
的样子
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>fileName</key>
<defaultValue>defaultTest</defaultValue>
</discriminator>
<sift>
<appender name="FILE-${fileName}" class="ch.qos.logback.core.FileAppender">
<file>${fileName}.log</file>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{HH:mm:ss:SSS} | %-5level | %thread | %logger{20} | %msg%n%rEx</pattern>
</layout>
</appender>
</sift>
</appender>
<root level="ALL">
<appender-ref ref="SIFT"/>
</root>
</configuration>
下面是使用所有这些的测试用例的外观
public class ManyTestCases {
@Test
public void testMethod1() {
runTest("http://www.google.com");
}
@Test
public void testMethod2() {
runTest("http://www.yahoo.com");
}
private void runTest(String url) {
ChromeDriver cd = new ChromeDriver();
EventFiringWebDriver driver = new EventFiringWebDriver(cd);
LogAwareWebDriverEventListener listener = new LogAwareWebDriverEventListener();
String outputFolder = Reporter.getCurrentTestResult().getTestContext().getSuite().getOutputDirectory();
listener.bindLogName(Reporter.getCurrentTestResult().getName(), outputFolder);
driver.register(listener);
driver.get(url);
driver.quit();
listener.unbind();
}
}
Maven依赖项:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
</dependency>
回写
(参考此内容了解如何在SLF4j中使用多个鉴别器)
我知道您为@tests创建了多个日志文件,而不是多个WebDriver实例。如果我错了,你想对实现这一目标有所帮助吗?我需要将步骤详细信息记录/写入到不同的文件中,这些文件是基于从“suite.xml”创建的大量“WebDriver”实例创建的。在这种情况下,我使用两种浏览器“Chrome和IE”,我只有一种测试方法。从这个测试方法中,我需要根据每个驱动程序实例编写执行细节(只传递驱动程序)。例如:《IE》可能一步成功,但《Chrome》可能同样失败。但是我的文件通过监听每个驱动程序来单独记录这些细节。@Ajesh-如果您仔细查看我共享的示例,您会注意到它确实是基于每个webdriver实例的(我在每个测试方法中创建了一个webdriver实例)。您应该能够扩展相同的方法,并以您需要的任何方式进行扩展。我向您展示的示例应该很容易采用,以满足您的特定需求。我尝试通过引用“slf4j-api-1.7.21.jar”来运行代码。但它没有创建日志文件,而是在控制台SLF4J中引发异常:未能加载类“org.SLF4J.impl.StaticMDCBinder”。SLF4J:默认为无操作MDCAdapter实现。SLF4J:有关更多详细信息,请参阅。SLF4J:未能加载类“org.SLF4J.impl.StaticLoggerBinder”。SLF4J:默认为无操作(NOP)记录器实现SLF4J:有关更多详细信息,请参阅。你能指导我吗?同样使用“logback classic”会在LoggerFactory.getLogger(getClass()).info(“加载url”+url);)上出现错误;。你能告诉我哪里错了吗。我正在运行一个java项目,而不是maven项目。我知道您已经为@tests创建了多个日志文件,而不是为多个WebDriver实例创建了多个日志文件。如果我错了,你想对实现这一目标有所帮助吗?我需要将步骤详细信息记录/写入到不同的文件中,这些文件是基于从“suite.xml”创建的大量“WebDriver”实例创建的。在这种情况下,我使用两种浏览器“Chrome和IE”,我只有一种测试方法。从这个测试方法中,我需要根据每个驱动程序实例编写执行细节(只传递驱动程序)。例如:《IE》可能一步成功,但《Chrome》可能同样失败。但是我的文件通过监听每个驱动程序来单独记录这些细节。@Ajesh-如果您仔细查看我共享的示例,您会注意到它确实是基于每个webdriver实例的(我在每个测试方法中创建了一个webdriver实例)。您应该能够扩展相同的方法,并以您需要的任何方式进行扩展。我向您展示的示例应该很容易采用,以满足您的特定需求。我尝试通过引用“slf4j-api-1.7.21.jar”来运行代码。但它没有创建日志文件,而是在控制台SLF4J中引发异常:未能加载类“org.SLF4J.impl.StaticMDCBinder”。SLF4J:默认为无操作MDCAdapter实现。SLF4J:有关更多详细信息,请参阅。SLF4J:未能加载类“org.SLF4J.impl.StaticLoggerBinder”。SLF4J:默认为无操作(NOP)记录器实现SLF4J:有关更多详细信息,请参阅。你能指导我吗?同样使用“logback classic”会在LoggerFactory.getLogger(getClass()).info(“加载url”+url);)上出现错误;。你能告诉我哪里错了吗。我正在运行一个java项目,而不是maven项目。