下面列出了怎么用org.openqa.selenium.logging.LogEntry的API类实例代码及写法,或者点击链接到github查看源代码。
@Override
protected void failed(Throwable e, Description desc) {
// print appium logs
LogEntries entries = driver.manage().logs().get("server");
System.out.println("======== APPIUM SERVER LOGS ========");
for (LogEntry entry : entries) {
System.out.println(new Date(entry.getTimestamp()) + " " + entry.getMessage());
}
System.out.println("================");
// print source
System.out.println("======== APP SOURCE ========");
System.out.println(driver.getPageSource());
System.out.println("================");
// save screenshot
String testName = desc.getMethodName().replaceAll("[^a-zA-Z0-9-_\\.]", "_");
File screenData = driver.getScreenshotAs(OutputType.FILE);
try {
File screenFile = new File(SCREEN_DIR + "/" + testName + ".png");
FileUtils.copyFile(screenData, screenFile);
System.out.println("======== SCREENSHOT ========");
System.out.println(screenFile.getAbsolutePath());
System.out.println("================");
} catch (IOException ign) {}
}
/**
* @throws Exception if the test fails
*/
@Test
@BuggyWebDriver
public void assertOnly() throws Exception {
final String html
= "<html>\n"
+ "<body>\n"
+ "<script>\n"
+ " number = 1;\n"
+ " console.assert(number % 2 === 0);\n"
+ "</script>\n"
+ "</body></html>";
final WebDriver driver = loadPage2(html);
final Logs logs = driver.manage().logs();
final LogEntries logEntries = logs.get(LogType.BROWSER);
final List<LogEntry> logEntryList = logEntries.getAll();
assertEquals(1, logEntryList.size());
final LogEntry logEntry = logEntryList.get(0);
assertTrue(logEntry.getMessage(), logEntry.getMessage().contains("Assertion failed"));
}
/**
* @throws Exception if the test fails
*/
@Test
@BuggyWebDriver
public void assertString() throws Exception {
final String html
= "<html>\n"
+ "<body>\n"
+ "<script>\n"
+ " number = 1;\n"
+ " console.assert(number % 2 === 0, 'the # is not even');\n"
+ "</script>\n"
+ "</body></html>";
final WebDriver driver = loadPage2(html);
final Logs logs = driver.manage().logs();
final LogEntries logEntries = logs.get(LogType.BROWSER);
final List<LogEntry> logEntryList = logEntries.getAll();
assertEquals(1, logEntryList.size());
final LogEntry logEntry = logEntryList.get(0);
assertTrue(logEntry.getMessage(), logEntry.getMessage().contains("Assertion failed: the # is not even"));
}
/**
* @throws Exception if the test fails
*/
@Test
@BuggyWebDriver
public void assertObject() throws Exception {
final String html
= "<html>\n"
+ "<body>\n"
+ "<script>\n"
+ " number = 1;\n"
+ " console.assert(number % 2 === 0, {number: number, errorMsg: 'the # is not even'});\n"
+ "</script>\n"
+ "</body></html>";
final WebDriver driver = loadPage2(html);
final Logs logs = driver.manage().logs();
final LogEntries logEntries = logs.get(LogType.BROWSER);
final List<LogEntry> logEntryList = logEntries.getAll();
assertEquals(1, logEntryList.size());
final LogEntry logEntry = logEntryList.get(0);
assertTrue(logEntry.getMessage(), logEntry.getMessage()
.contains("Assertion failed: ({number: 1.0, errorMsg: \"the # is not even\"})"));
}
/**
* @throws Exception if the test fails
*/
@Test
@BuggyWebDriver
public void assertObjects() throws Exception {
final String html
= "<html>\n"
+ "<body>\n"
+ "<script>\n"
+ " number = 1;\n"
+ " console.assert(number % 2 === 0, {number: number}, {errorMsg: 'the # is not even'});\n"
+ "</script>\n"
+ "</body></html>";
final WebDriver driver = loadPage2(html);
final Logs logs = driver.manage().logs();
final LogEntries logEntries = logs.get(LogType.BROWSER);
final List<LogEntry> logEntryList = logEntries.getAll();
assertEquals(1, logEntryList.size());
final LogEntry logEntry = logEntryList.get(0);
assertTrue(logEntry.getMessage(), logEntry.getMessage()
.contains("Assertion failed: ({number: 1.0}) ({errorMsg: \"the # is not even\"})"));
}
/**
* @throws Exception if the test fails
*/
@Test
@BuggyWebDriver
public void assertParams() throws Exception {
final String html
= "<html>\n"
+ "<body>\n"
+ "<script>\n"
+ " console.assert(false, 'the word is %s', 'foo');\n"
+ "</script>\n"
+ "</body></html>";
final WebDriver driver = loadPage2(html);
final Logs logs = driver.manage().logs();
final LogEntries logEntries = logs.get(LogType.BROWSER);
final List<LogEntry> logEntryList = logEntries.getAll();
assertEquals(1, logEntryList.size());
final LogEntry logEntry = logEntryList.get(0);
assertTrue(logEntry.getMessage(), logEntry.getMessage()
.contains("Assertion failed: the word is foo"));
}
@SuppressWarnings("squid:S4784")
private void appendWebDriverLog(WebDriver driver) {
for (String logType : logTypes) {
for (LogEntry log : driver.manage().logs().get(logType)) {
DateFormat formatter = new SimpleDateFormat("HH:mm:ss.SSS");
String message = log.getMessage();
// filter out messages related to fetching the log
if (!message.matches(REGEXP_FILTER)) {
SERVER_LOG
.atInfo()
.addArgument(() -> logType)
.addArgument(() -> formatter.format(log.getTimestamp()))
.addArgument(() -> log.getMessage())
.log("{} {} {}");
}
}
}
}
/**
* Propagate the specified web driver exception, extracting encoded JavaScript exception if present
*
* @param driver A handle to the currently running Selenium test window.
* @param exception web driver exception to propagate
* @return nothing (this method always throws the specified exception)
* @since 17.4.0
*/
public static RuntimeException propagate(final WebDriver driver, final WebDriverException exception) {
Throwable thrown = exception;
// if exception is a WebDriverException (not a sub-class)
if (JS_EXCEPTIONS.contains(exception.getClass().getName())) {
// extract serialized exception object from message
thrown = extractException(exception, exception.getMessage());
// if driver spec'd and no serialized exception found
if ((driver != null) && (thrown.equals(exception))) {
// get browser log entries
LogEntries logEntries = driver.manage().logs().get(LogType.BROWSER);
// for each log entry
for (LogEntry logEntry : logEntries.filter(Level.WARNING)) {
// extract serialized exception object from message
thrown = extractException(exception, logEntry.getMessage());
// done if serialized exception found
if (!thrown.equals(exception)) break;
}
}
}
// throw resolved exception as unchecked
throw UncheckedThrow.throwUnchecked(thrown);
}
private static void recordLogEntry(LogEntry entry) {
String time;
String level;
String text;
try {
// handle messages written by @jenkins-cd/js-logging
Map<String, Object> messageJson = jsonMapper.readValue(entry.getMessage(), typeRef);
Map<String, Object> message = (Map<String, Object>) messageJson.get("message");
time = String.valueOf(message.get("timestamp"));
level = String.valueOf(message.get("level"));
text = String.valueOf(message.get("text"));
} catch (IOException e) {
// handle messages written natively by console.error|warn|log|debug
time = String.valueOf(entry.getTimestamp());
level = String.valueOf(entry.getLevel());
text = entry.getMessage();
}
logger.info(String.format("%s - %s - %s", time, level, text));
}
@Override
public String getLog( DeviceWebDriver webDriver )
{
try
{
LogEntries logEntries = webDriver.manage().logs().get( LogType.BROWSER );
if ( logEntries != null )
{
StringBuilder logBuilder = new StringBuilder();
for ( LogEntry logEntry : logEntries )
logBuilder.append( dateFormat.format( new Date( logEntry.getTimestamp() ) ) ).append( ": " ).append( logEntry.getMessage() ).append( "\r\n" );
return logBuilder.toString();
}
return null;
}
catch ( Exception e )
{
log.info( "Could not generate device logs" );
return null;
}
}
@Override
public String getLog( DeviceWebDriver webDriver )
{
try
{
LogEntries logEntries = webDriver.manage().logs().get( LogType.BROWSER );
if ( logEntries != null )
{
StringBuilder logBuilder = new StringBuilder();
for ( LogEntry logEntry : logEntries )
logBuilder.append( dateFormat.format( new Date( logEntry.getTimestamp() ) ) ).append( ": " ).append( logEntry.getMessage() ).append( "\r\n" );
logBuilder.toString();
}
return null;
}
catch ( Exception e )
{
log.info( "Could not generate device logs" );
return null;
}
}
@Override
public String getLog( DeviceWebDriver webDriver )
{
try
{
LogEntries logEntries = webDriver.manage().logs().get( LogType.BROWSER );
if ( logEntries != null )
{
StringBuilder logBuilder = new StringBuilder();
for ( LogEntry logEntry : logEntries )
logBuilder.append( dateFormat.format( new Date( logEntry.getTimestamp() ) ) ).append( ": " ).append( logEntry.getMessage() ).append( "\r\n" );
logBuilder.toString();
}
return null;
}
catch ( Exception e )
{
log.info( "Could not generate device logs" );
return null;
}
}
@Override
public String getLog( DeviceWebDriver webDriver )
{
try
{
LogEntries logEntries = webDriver.manage().logs().get( "driver" );
if ( logEntries != null )
{
StringBuilder logBuilder = new StringBuilder();
for ( LogEntry logEntry : logEntries )
logBuilder.append( dateFormat.format( new Date( logEntry.getTimestamp() ) ) ).append( ": " ).append( logEntry.getMessage() ).append( "\r\n" );
logBuilder.toString();
}
return null;
}
catch ( Exception e )
{
log.info( "Could not generate device logs" );
return null;
}
}
@Test
public void testPolyfillLoaded() {
open();
if (BrowserUtil.isIE(getDesiredCapabilities())) {
// Console logs are not available from IE11
return;
}
LogEntries logs = driver.manage().logs().get("browser");
if (logs != null) {
Optional<LogEntry> anyError = StreamSupport
.stream(logs.spliterator(), true)
.filter(entry -> entry.getLevel().intValue() > Level.INFO
.intValue())
.filter(entry -> !entry.getMessage()
.contains("favicon.ico"))
.filter(entry -> !entry.getMessage()
.contains("sockjs-node"))
.filter(entry -> !entry.getMessage()
.contains("[WDS] Disconnected!"))
.findAny();
anyError.ifPresent(entry -> Assert.fail(entry.getMessage()));
}
}
private void testErrorCase(String caseName, String errorMessageSnippet) {
open();
if (hasClientUnknownIssue()) {
return;
}
findElement(By.id(caseName)).click();
String statusText = findElement(By.id("new-component")).getText();
Assert.assertEquals("Div updated for " + caseName, statusText);
List<LogEntry> entries = getLogEntries(Level.SEVERE);
Assert.assertEquals(2, entries.size());
Assert.assertThat(entries.get(0).getMessage(),
Matchers.containsString(errorMessageSnippet));
Assert.assertThat(entries.get(1).getMessage(),
Matchers.containsString("could not be loaded"));
}
protected void startLogging(ITestResult iTestResult)
throws IOException, InterruptedException {
String methodName = iTestResult.getMethod().getMethodName();
String className = iTestResult.getTestClass()
.getRealClass().getSimpleName();
if (isNativeAndroid()) {
String udid = AppiumDeviceManager.getAppiumDevice().getDevice().getUdid();
List<LogEntry> logcat = AppiumDriverManager.getDriver().manage()
.logs().get("logcat").filter(Level.ALL);
logEntries.set(logcat);
logFile = new File(System.getProperty("user.dir") + FileLocations.ADB_LOGS_DIRECTORY
+ udid + "__" + methodName + ".txt");
log_file_writer.set(new PrintWriter(logFile));
}
if ("true".equalsIgnoreCase(System.getenv("VIDEO_LOGS"))) {
IScreenRecord videoRecording = AppiumScreenRecordFactory.recordScreen();
videoRecording.startVideoRecording(className, methodName, methodName);
}
setDescription(iTestResult);
}
@FailedTest
public static void storeBrowsersLogs() {
List<String> lines = new ArrayList<>();
for (String browserKey : browserLogs.keySet()) {
for (LogEntry logEntry : browserLogs.get(browserKey)) {
lines.add(logEntry.toString());
}
File file = new File(getDefaultOutputFile("-" + browserKey + "-console.log"));
try {
FileUtils.writeLines(file, lines);
} catch (IOException e) {
log.error("Error while writing browser log to a file", e);
}
}
}
public SeleniumTestResult(WebDriver d, SeleniumTest test, Throwable cause, LoggingPreferences ___lp___) {
this.status = false;
this.internalTestRes = test.getSession().internalTestRs;
/*Logs logs = d.manage().logs();
for (String s : LOG_TYPES_SET) {
if(!logs.getAvailableLogTypes().contains(s))continue;
LogEntries logEntries = logs.get(s);
if(logEntries!=null && !logEntries.getAll().isEmpty()) {
this.logs.put(s, new SerializableLogEntries(logEntries.getAll()));
}
}*/
List<LogEntry> entries = new ArrayList<LogEntry>();
entries.add(new LogEntry(Level.ALL, new Date().getTime(), cause.getMessage()));
entries.add(new LogEntry(Level.ALL, new Date().getTime(), ExceptionUtils.getStackTrace(cause)));
this.logs.put("gatf", new SerializableLogEntries(entries));
}
private LogEntries getRemoteEntries(String logType) {
Object raw = executeMethod.execute(DriverCommand.GET_LOG, ImmutableMap.of(TYPE_KEY, logType));
if (!(raw instanceof List)) {
throw new UnsupportedCommandException("malformed response to remote logs command");
}
@SuppressWarnings("unchecked")
List<Map<String, Object>> rawList = (List<Map<String, Object>>) raw;
List<LogEntry> remoteEntries = new ArrayList<>(rawList.size());
for (Map<String, Object> obj : rawList) {
remoteEntries.add(new LogEntry(LogLevelMapping.toLevel((String)obj.get(LEVEL)),
(Long) obj.get(TIMESTAMP),
(String) obj.get(MESSAGE)));
}
return new LogEntries(remoteEntries);
}
@Test
public void convertLogEntriesToJson() {
long timestamp = new Date().getTime();
final LogEntry entry1 = new LogEntry(Level.OFF, timestamp, "entry1");
final LogEntry entry2 = new LogEntry(Level.WARNING, timestamp, "entry2");
LogEntries entries = new LogEntries(asList(entry1, entry2));
String json = convert(entries);
JsonArray converted = new JsonParser().parse(json).getAsJsonArray();
JsonObject obj1 = converted.get(0).getAsJsonObject();
JsonObject obj2 = converted.get(1).getAsJsonObject();
assertThat(obj1.get("level").getAsString()).isEqualTo("OFF");
assertThat(obj1.get("timestamp").getAsLong()).isEqualTo(timestamp);
assertThat(obj1.get("message").getAsString()).isEqualTo("entry1");
assertThat(obj2.get("level").getAsString()).isEqualTo("WARNING");
assertThat(obj2.get("timestamp").getAsLong()).isEqualTo(timestamp);
assertThat(obj2.get("message").getAsString()).isEqualTo("entry2");
}
@Test
public void canGetProfilerLogs() {
List<LogEntry> entries = new ArrayList<>();
entries.add(new LogEntry(Level.INFO, 0, "hello"));
when(localLogs.get(LogType.PROFILER)).thenReturn(new LogEntries(entries));
when(
executeMethod.execute(
DriverCommand.GET_LOG, ImmutableMap.of(RemoteLogs.TYPE_KEY, LogType.PROFILER)))
.thenReturn(singletonList(
ImmutableMap.of("level", Level.INFO.getName(), "timestamp", 1L, "message", "world")));
LogEntries logEntries = remoteLogs.get(LogType.PROFILER);
List<LogEntry> allLogEntries = logEntries.getAll();
assertThat(allLogEntries).hasSize(2);
assertThat(allLogEntries.get(0).getMessage()).isEqualTo("hello");
assertThat(allLogEntries.get(1).getMessage()).isEqualTo("world");
}
@Test
public void canGetLocalProfilerLogsIfNoRemoteProfilerLogSupport() {
List<LogEntry> entries = new ArrayList<>();
entries.add(new LogEntry(Level.INFO, 0, "hello"));
when(localLogs.get(LogType.PROFILER)).thenReturn(new LogEntries(entries));
when(
executeMethod.execute(
DriverCommand.GET_LOG, ImmutableMap.of(RemoteLogs.TYPE_KEY, LogType.PROFILER)))
.thenThrow(
new WebDriverException("IGNORE THIS LOG MESSAGE AND STACKTRACE; IT IS EXPECTED."));
LogEntries logEntries = remoteLogs.get(LogType.PROFILER);
List<LogEntry> allLogEntries = logEntries.getAll();
assertThat(allLogEntries).hasSize(1);
assertThat(allLogEntries.get(0).getMessage()).isEqualTo("hello");
}
private StringBuilder formatedBrowserLogs() {
StringBuilder logEntries = new StringBuilder();
SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for (LogEntry logEntry : getBrowserLog().getAll()) {
logEntries.append(logEntry.getLevel()).append(": ")
.append(sdfDate.format(logEntry.getTimestamp())).append(": ")
.append(logEntry.getMessage()).append(System.lineSeparator());
}
return logEntries;
}
public static Set<LogEntry> getFilteredLog(WebDriver driver, Collection<BrowserLogLevel> logLevelsToInclude)
{
LogEntries log = getLog(driver);
return logLevelsToInclude.stream()
.map(BrowserLogLevel::getLevel)
.flatMap(level -> filter(log, level))
.collect(Collectors.toCollection(LinkedHashSet::new));
}
private static Stream<LogEntry> filter(LogEntries log, Level level)
{
int levelValue = level.intValue();
return log.getAll().stream().filter(logEntry ->
{
int logEntryLevel = logEntry.getLevel().intValue();
return logEntryLevel >= levelValue && logEntryLevel <= levelValue;
});
}
/**
* Checks that opened page contains JavaScript browser console logs that matches regex.
* <p>Note that log buffers are reset after step invocation, meaning that available log entries correspond to those
* entries not yet returned for a given log type. In practice, this means that this step invocation will return the
* available log entries since the last step invocation (or from the last page navigation if corresponding listener
* is enabled).</p>
* <p>Step passes if console logs were found, otherwise it fails. All found logs are available in
* report step's attachment</p>
* @param logEntries Log entries to check: "errors", "warnings", "errors, warnings" or "warnings, errors"
* @param regex Regular expression to filter log entries
*/
@Then(value = "there are browser console $logEntries by regex `$regex`")
public void checkThereAreLogEntriesOnOpenedPageFiltredByRegExp(List<BrowserLogLevel> logEntries, String regex)
{
WebDriver webDriver = webDriverProvider.get();
Set<LogEntry> filteredLogEntries = BrowserLogManager.getFilteredLog(webDriver, logEntries).stream()
.filter(logEntry -> logEntry.getMessage().matches(regex))
.collect(Collectors.toSet());
publishAttachment(Map.of(webDriver.getCurrentUrl(), filteredLogEntries));
softAssert.assertFalse(String.format("Current page contains JavaScript %s by regex '%s'",
toString(logEntries), regex), filteredLogEntries.isEmpty());
}
private void checkFilteredJsEntries(List<BrowserLogLevel> logLevels, Predicate<? super LogEntry> filter)
{
WebDriver webDriver = webDriverProvider.get();
Set<LogEntry> filteredLogEntries = BrowserLogManager.getFilteredLog(webDriver, logLevels).stream()
.filter(filter)
.collect(Collectors.toSet());
publishAttachment(Map.of(webDriver.getCurrentUrl(), filteredLogEntries));
softAssert.assertEquals("Current page contains no JavaScript " + toString(logLevels), 0,
filteredLogEntries.size());
}
@Test
void shouldReturnFilteredLogContainingEntries()
{
WebDriver webDriver = mockBrowserName(BrowserType.CHROME);
LogEntries logEntries = mockLogRetrieval(webDriver);
Set<LogEntry> filteredLog = BrowserLogManager.getFilteredLog(webDriver, singleton(BrowserLogLevel.ERRORS));
assertEquals(singleton(logEntries.getAll().get(0)), filteredLog);
}
@Test
void shouldReturnFilteredLogContainingNoEntries()
{
WebDriver webDriver = mockBrowserName(BrowserType.CHROME);
mockLogRetrieval(webDriver);
Set<LogEntry> filteredLog = BrowserLogManager.getFilteredLog(webDriver, singleton(BrowserLogLevel.WARNINGS));
assertEquals(emptySet(), filteredLog);
}
private static LogEntries mockLogRetrieval(WebDriver webDriver)
{
Options options = mock(Options.class);
when(webDriver.manage()).thenReturn(options);
Logs logs = mock(Logs.class);
when(options.logs()).thenReturn(logs);
when(options.logs()).thenReturn(logs);
LogEntry severeEntry = new LogEntry(Level.SEVERE, 1L, ERROR_MESSAGE);
LogEntry infoEntry = new LogEntry(Level.INFO, 1L, ERROR_MESSAGE);
LogEntries logEntries = new LogEntries(Arrays.asList(severeEntry, infoEntry));
when(logs.get(LogType.BROWSER)).thenReturn(logEntries);
return logEntries;
}