web-dev-qa-db-ja.com

Javaを使用してSelenium WebDriverでブラウザーログをキャプチャする

Seleniumを使用して自動化されたテストケースを実行しながら、ブラウザログをキャプチャする方法はありますか? SeleniumでJavaScriptエラーをキャプチャする方法 に関する記事を見つけました。しかし、それはFirefoxのためだけであり、エラーのためだけです。すべてのコンソールログを取得したいと思います。

58
user3246489

私はそれが次の行にあると思います:

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のコンソールログを取得

53
Margus

より簡潔な方法で、次のことができます。

LogEntries logs = driver.manage().logs().get("browser");

私にとっては、コンソールでJSエラーをキャッチするのに素晴らしい働きをしました。次に、サイズの検証を追加できます。たとえば、> 0の場合、エラー出力を追加します。

41
Johnny

非Java Seleniumユーザーとして、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の回答と非常によく似ているため、このスレッドに保持し、この投稿は同様のPythonの質問のGoogle検索で返されます

18
Anna

よりエレガントなソリューションは、ユーザーデータディレクトリからログを「手動で」取得することです。

  1. ユーザーデータディレクトリを固定の場所に設定します。

    options = new ChromeOptions();
    capabilities = DesiredCapabilities.chrome();
    options.addArguments("user-data-dir=/your_path/");
    capabilities.setCapability(ChromeOptions.CAPABILITY, options);
    
  2. 上記で入力したパスにあるログファイルchrome_debug.logからテキストを取得します。

RemoteWebDriverはコンソールログをリモートで取得する際に問題が発生したため、この方法を使用します。テストをローカルで実行すると、簡単に取得できます。

4
didinino

Firefox 65以降、about:configフラグが存在するため、console.log()のようなコンソールAPI呼び出しが出力ストリームに、したがってログファイルに表示されます((- https://github.com/mozilla/ geckodriver/issues/284#issuecomment-458305621 )。

profile = new FirefoxProfile();
profile.setPreference("devtools.console.stdout.content", true);
1
phk