使用Java使用Selenium WebDriver捕获浏览器日志


Answers:


67

我认为这是符合以下条件的:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.logging.LogEntries;
import org.openqa.selenium.logging.LogEntry;
import org.openqa.selenium.logging.LogType;
import org.openqa.selenium.logging.LoggingPreferences;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

public class ChromeConsoleLogging {
    private WebDriver driver;


    @BeforeMethod
    public void setUp() {
        System.setProperty("webdriver.chrome.driver", "c:\\path\\to\\chromedriver.exe");        
        DesiredCapabilities caps = DesiredCapabilities.chrome();
        LoggingPreferences logPrefs = new LoggingPreferences();
        logPrefs.enable(LogType.BROWSER, Level.ALL);
        caps.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);
        driver = new ChromeDriver(caps);
    }

    @AfterMethod
    public void tearDown() {
        driver.quit();
    }

    public void analyzeLog() {
        LogEntries logEntries = driver.manage().logs().get(LogType.BROWSER);
        for (LogEntry entry : logEntries) {
            System.out.println(new Date(entry.getTimestamp()) + " " + entry.getLevel() + " " + entry.getMessage());
            //do something useful with the data
        }
    }

    @Test
    public void testMethod() {
        driver.get("http://mypage.com");
        //do something on page
        analyzeLog();
    }
}

来源:获取chrome的控制台日志


不确定需要哪种浏览器支持,但是可以通过更改导入org.openqa.selenium.chrome.ChromeDriver; DesiredCapabilities上限= DesiredCapabilities.chrome(); 您应该可以选择它。
Margus 2014年

我需要所有的浏览器...对此表示感谢。这绝对是我可以与@Margus一起使用的东西
user3246489

chrome的不错解决方案,但您有IE11的解决方案吗?
斯特凡Grillon的

2
@Margus如果我driver.manage().logs().get("browser");在同一个驱动程序实例中多次调用,它将无法捕获条目(尝试刷新驱动程序,导航至另一个URL)。有什么想法或解决方法吗?
user2649233 '18

@ user3246489我上次检查它是否不支持IE,请参见github.com/SeleniumHQ/selenium/issues/4802
elworthy

53

您可以通过更简洁的方式执行以下操作:

LogEntries logs = driver.manage().logs().get(LogType.BROWSER);

对我来说,它在捕获控制台中的JS错误方面表现出色。然后,您可以为其尺寸添加一些验证。例如,如果它> 0,则添加一些错误输出。


4
很棒,不必设置所需的功能就可以像魅力一样工作。
塔伦(Tarun)2016年

chrome的不错解决方案,但您有IE11的解决方案吗?
斯特凡Grillon的

IE11 WebDriver应该具有相同的API,并且行为类似。
约翰尼

3
@Stas如果我driver.manage().logs().get("browser");在同一个驱动程序实例中多次调用,它将无法捕获条目(尝试刷新驱动程序,导航至另一个URL)。有什么想法或解决方法吗?
user2649233

@ManPy您正在使用什么WebDriver实现(==浏览器),驱动程序版本和语言?
约翰尼

24

作为非Java硒用户,以下是等效于Margus答案的python

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities    

class ChromeConsoleLogging(object):

    def __init__(self, ):
        self.driver = None

    def setUp(self, ):
        desired = DesiredCapabilities.CHROME
        desired ['loggingPrefs'] = { 'browser':'ALL' }
        self.driver = webdriver.Chrome(desired_capabilities=desired)

    def analyzeLog(self, ):
        data = self.driver.get_log('browser')
        print(data)

    def testMethod(self, ):
        self.setUp()
        self.driver.get("http://mypage.com")
        self.analyzeLog()

参考

编辑:将Python答案保留在此线程中,因为它与Java答案非常相似,并且此帖子在Google搜索中返回,以查找类似的Python问题


忘记了analogLog函数上的半冒号
casper

1
从chromedriver 75.0.3770.8开始,您必须使用goog:loggingPrefs代替loggingPrefs
Mike Monteith,

4

不太优雅的解决方案是从用户数据目录“手动”获取日志:

  1. 将用户数据目录设置在固定位置:

    options = new ChromeOptions();
    capabilities = DesiredCapabilities.chrome();
    options.addArguments("user-data-dir=/your_path/");
    capabilities.setCapability(ChromeOptions.CAPABILITY, options);
    
  2. 从您在上面输入的路径中的日志文件chrome_debug.log中获取文本。

我使用此方法,因为RemoteWebDriver在远程获取控制台日志时遇到问题。如果您在本地运行测试,则很容易找回。



2

使用Chrome浏览器驱动程序选项将LoggingPreferences添加到“ goog:loggingPrefs”属性中,有助于获取所有日志级别的浏览器控制台日志。

ChromeOptions options = new ChromeOptions();    
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.BROWSER, Level.ALL);
options.setCapability("goog:loggingPrefs", logPrefs);
WebDriver driver = new ChromeDriver(options);

1

驱动程序管理器日志可用于从浏览器获取控制台日志,这将有助于识别控制台中出现的错误。

   import org.openqa.selenium.logging.LogEntries;
   import org.openqa.selenium.logging.LogEntry;

    public List<LogEntry> getBrowserConsoleLogs()
    {
    LogEntries log= driver.manage().logs().get("browser")
    List<LogEntry> logs=log.getAll();
    return logs;
    }

0

在启动webdriver之前,我们只需设置此环境变量以让chrome生成它:

export CHROME_LOG_FILE=$(pwd)/tests/e2e2/logs/client.log

0

添加演员表RemoteWebDriver进行driver初始化,您将拥有以下.setLogLevel方法:

import java.util.logging.Level;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.RemoteWebDriver;

public class PrintLogTest {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "/Users/.../chromedriver");
        WebDriver driver = new ChromeDriver();

        //here
        ((RemoteWebDriver) driver).setLogLevel(Level.INFO);

        driver.get("https://google.com/");
        driver.findElement(By.name("q")).sendKeys("automation test");
        driver.quit();
    }
}

输出示例:

Jun 15, 2020 4:27:04 PM org.openqa.selenium.remote.RemoteWebDriver log
INFO: Executing: get [430aec21a9beb6340a4185c4ea6a693d, get {url=https://google.com/}]
Jun 15, 2020 4:27:06 PM org.openqa.selenium.remote.RemoteWebDriver log
INFO: Executed: [430aec21a9beb6340a4185c4ea6a693d, get {url=https://google.com/}]
Jun 15, 2020 4:27:06 PM org.openqa.selenium.remote.RemoteWebDriver log
INFO: Executing: findElement [430aec21a9beb6340a4185c4ea6a693d, findElement {using=name, value=q}]
Jun 15, 2020 4:27:06 PM org.openqa.selenium.remote.RemoteWebDriver log
INFO: Executed: [430aec21a9beb6340a4185c4ea6a693d, findElement {using=name, value=q}]
...
...

至少我已经试过了,ChromeDriver()并且FirefoxDriver()工作正常。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.