【问题标题】:How to write multiple Selenium WebDriver session logs into different files when they run parallel using java使用java并行运行时如何将多个Selenium WebDriver会话日志写入不同的文件
【发布时间】:2016-11-17 05:58:25
【问题描述】:

寻找将 Selenium webDriver 脚本的逐步执行细节写入文件的解决方案。需要将日志添加到为 testng.xml 中的每个“测试”创建并在不同浏览器上运行的文件中。 这已经通过实现 WebDriverEventListener 实现了“一个会话”。(但我不知道在一个方法中将每个驱动程序实例自定义日志写入不同的文件) 但正在寻找将每个“日志文件”与“Webdriver 实例”绑定并将相应的浏览器操作写入其中的解决方案。

@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>

【问题讨论】:

    标签: java selenium selenium-webdriver automation testng


    【解决方案1】:

    如果您依赖诸如 SLF4j 之类的日志框架,您应该能够非常轻松地做到这一点。 在高层次上,您需要利用 SLF4j 为您提供的 SiftingAppender,并将值注入您在代码中在 logback.xml 中引用的变量。

    我已经在我的this 博客文章中捕获了所有这些信息以及一个示例。

    但为了参考起见,我在这篇文章中也包括了最基本的要点。

    这是我的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>
    

    这是一个修改后的监听器,用于注入EventFiringWebDriver

    public class LogAwareWebDriverEventListener extends AbstractWebDriverEventListener{
    
        @Override
        public void beforeNavigateTo(String url, WebDriver driver) {
            LoggerFactory.getLogger(getClass()).info("Loading url " + url);
        }
    
        public void bindLogName(String log, String folderName) {
            String path = new File(folderName).getAbsolutePath() + File.separator;
            MDC.put("fileName", path + log);
        }
    
        public void unbind() {
            MDC.remove("fileName");
        }
    }
    

    这是一个使用所有这些的测试用例的样子。

    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>
    

    参考资料:

    【讨论】:

    • 我了解到您为 @tests 创建了多个日志文件,而不是为多个 WebDriver 实例创建了多个日志文件。如果我错了,你想对实现这一目标有所了解吗?我需要将步骤详细信息记录/写入到不同的文件中,这些文件是基于从“suite.xml”创建的许多“WebDriver”实例创建的。在这种情况下,我使用了两种浏览器“Chrome 和 IE”,而我只有一种测试方法。
    • 从这个测试方法中,我需要根据每个驱动实例编写执行细节(只通过Driver)。例如:在“IE”中可能一步成功,但在“Chrome”中可能会失败。但是我的文件通过监听每个驱动程序来单独记录这些细节。
    • @Ajesh - 如果您仔细查看我分享的示例,您会注意到它确实是基于每个 webdriver 实例(我在每个测试方法中创建一个 webdriver 实例)。您应该能够扩展这种相同的方法并以您需要的任何方式进行操作。我向您展示的示例应该很容易满足您的特定需求。
    • 我尝试通过引用“slf4j-api-1.7.21.jar”来运行代码。但它没有创建日志文件,而是在控制台 SLF4J 中抛出异常:无法加载类“org.slf4j.impl.StaticMDCBinder”。 SLF4J:默认为无操作 MDCAdapter 实现。 SLF4J:有关详细信息,请参阅slf4j.org/codes.html#no_static_mdc_binder。 SLF4J:无法加载类“org.slf4j.impl.StaticLoggerBinder”。 SLF4J:默认为无操作 (NOP) 记录器实现 SLF4J:有关详细信息,请参阅 slf4j.org/codes.html#StaticLoggerBinder。你能指导我吗?
    • 同样使用 'logback-classic' 在 LoggerFactory.getLogger(getClass()).info("Loading url " + url); 上会出现错误。你能告诉我我错在哪里吗?我正在运行一个 java 项目而不是 maven 项目。
    猜你喜欢
    • 2018-03-24
    • 1970-01-01
    • 2016-03-13
    • 2021-08-19
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    相关资源
    最近更新 更多