Skip to content

Commit acf8692

Browse files
committed
log and code export features
1 parent 8208098 commit acf8692

File tree

14 files changed

+121
-6
lines changed

14 files changed

+121
-6
lines changed

packages/selenium-ide/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@seleniumhq/selenium-ide",
3-
"version": "4.0.0-alpha.25",
3+
"version": "4.0.0-alpha.26",
44
"private": true,
55
"description": "Selenium IDE electron app",
66
"author": "Todd <[email protected]>",
@@ -107,7 +107,7 @@
107107
"@seleniumhq/code-export-ruby-rspec": "^4.0.0-alpha.0",
108108
"@seleniumhq/side-code-export": "^4.0.0-alpha.2",
109109
"@seleniumhq/get-driver": "^4.0.0-alpha.1",
110-
"@seleniumhq/side-api": "^4.0.0-alpha.11",
110+
"@seleniumhq/side-api": "^4.0.0-alpha.12",
111111
"@seleniumhq/side-model": "^4.0.0-alpha.2",
112112
"@seleniumhq/side-plugin-example": "^4.0.0-alpha.1",
113113
"@seleniumhq/side-runtime": "^4.0.0-alpha.14",

packages/selenium-ide/src/browser/index.css

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ body,
3636
.pos-abs {
3737
position: absolute;
3838
}
39+
.pos-fixed {
40+
position: fixed;
41+
}
3942

4043
/**
4144
* Opacity utils
@@ -163,6 +166,10 @@ body,
163166
padding-top: 0;
164167
}
165168

169+
.p-1 {
170+
padding: 0.125rem;
171+
}
172+
166173
.py-3 {
167174
padding-bottom: 0.5rem;
168175
padding-top: 0.5rem;
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import Delete from '@mui/icons-material/Delete'
2+
import { Paper } from '@mui/material'
3+
import IconButton from '@mui/material/IconButton'
4+
import { LogLevel } from 'electron-log'
5+
import React from 'react'
6+
7+
const consoleStyle = {
8+
fontSize: '0.75rem',
9+
lineHeight: '1.2',
10+
}
11+
12+
const SIDELogger: React.FC = () => {
13+
const logContainer = React.useRef<HTMLPreElement>(null)
14+
React.useEffect(() => {
15+
const handleLog = (level: LogLevel, log: string) => {
16+
logContainer.current?.append(
17+
`${new Date().toLocaleTimeString()} [${level}] ${log}\n`
18+
)
19+
window.scrollTo(0, logContainer.current?.scrollHeight ?? 0)
20+
}
21+
window.sideAPI.system.onLog.addListener(handleLog)
22+
return () => {
23+
window.sideAPI.system.onLog.removeListener(handleLog)
24+
}
25+
}, [logContainer])
26+
return (
27+
<>
28+
<pre ref={logContainer} style={consoleStyle} />
29+
<div className="p-1 pos-fixed" style={{ top: 0, right: 0 }}>
30+
<Paper className="p-1" elevation={3}>
31+
<IconButton
32+
onClick={() => {
33+
if (logContainer.current) {
34+
logContainer.current.innerHTML = ''
35+
}
36+
}}
37+
>
38+
<Delete />
39+
</IconButton>
40+
</Paper>
41+
</div>
42+
</>
43+
)
44+
}
45+
46+
export default SIDELogger
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { WindowConfig } from 'browser/types'
2+
import Electron from 'electron'
3+
4+
const dimensions = {
5+
height: 200,
6+
width: 800,
7+
}
8+
export const window: WindowConfig['window'] = () => {
9+
const display = Electron.screen.getPrimaryDisplay()
10+
return {
11+
...dimensions,
12+
x:
13+
Math.floor(display.bounds.width / 2) -
14+
Math.floor(dimensions.width / 2) -
15+
275,
16+
y:
17+
Math.floor(display.bounds.height) -
18+
Math.floor(dimensions.height) -
19+
50,
20+
title: 'Logs',
21+
webPreferences: {
22+
nodeIntegrationInSubFrames: true,
23+
}
24+
}
25+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import '../../helpers/preload'
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import React from 'react'
2+
import AppWrapper from 'browser/components/AppWrapper'
3+
import renderWhenReady from 'browser/helpers/renderWhenReady'
4+
import SIDELogger from './components/Logger'
5+
6+
const ProjectPlaybackControls = () =>(
7+
<AppWrapper>
8+
<SIDELogger />
9+
</AppWrapper>
10+
)
11+
12+
renderWhenReady(ProjectPlaybackControls)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export * as Chromedriver from './Chromedriver/controller'
2+
export * as Logger from './Logger/controller'
23
export * as PlaybackWindow from './PlaybackWindow/controller'
34
export * as ProjectEditor from './ProjectEditor/controller'
45
export * as Splash from './Splash/controller'

packages/selenium-ide/src/main/index.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import 'v8-compile-cache'
22
import 'source-map-support/register'
33
import { app } from 'electron'
4-
import log from 'electron-log'
4+
import log, { LogMessage } from 'electron-log'
55
import store from './store'
66
import createSession from './session'
77
import installReactDevtools from './install-react-devtools'
88
import { join } from 'path'
9+
import { inspect } from 'util'
910

1011
// Configure log file
1112
const logFile = Date.now() + '.main.log'
@@ -30,6 +31,12 @@ process.on('uncaughtException', (error) => {
3031
// Instantiate the session
3132
const session = createSession(app, store)
3233

34+
// Wire up logging to the frontend
35+
const appTransport = (msg: LogMessage) =>
36+
session.api.system.onLog.dispatchEvent(msg.level, inspect(msg.data))
37+
appTransport.level = 'debug' as const
38+
log.transports.app = appTransport
39+
3340
app.on('open-file', async (_e, path) => {
3441
await session.projects.load(path)
3542
})

packages/selenium-ide/src/main/session/controllers/Menu/menus/suiteManager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export const suiteManagerCommands: MenuComponent<[string[]]> =
1212
suiteIDs.map((suiteID) => session.api.suites.delete(suiteID))
1313
)
1414
},
15-
label: 'Delete Suite(s)',
15+
label: 'Delete suite(s)',
1616
},
1717
{ type: 'separator' },
1818
...outputFormats.map((formatName) => ({

packages/selenium-ide/src/main/session/controllers/Menu/menus/testManager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export const testManagerCommands: MenuComponent<[string[]]> =
1212
testIDs.map((testID) => session.api.tests.delete(testID))
1313
)
1414
},
15-
label: 'Delete Suite(s)',
15+
label: 'Delete test(s)',
1616
},
1717
{ type: 'separator' },
1818
...outputFormats.map((formatName) => ({

0 commit comments

Comments
 (0)