feat(cli): make run-driver work (#4836)

This commit is contained in:
Dmitry Gozman 2020-12-28 15:44:24 -08:00 committed by GitHub
parent 293a7bdd4c
commit 068d8612a7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 36 additions and 37 deletions

View file

@ -22,7 +22,6 @@ import * as path from 'path';
import * as program from 'commander'; import * as program from 'commander';
import * as os from 'os'; import * as os from 'os';
import * as fs from 'fs'; import * as fs from 'fs';
import { installBrowsersWithProgressBar } from '../install/installer';
import * as consoleApiSource from '../generated/consoleApiSource'; import * as consoleApiSource from '../generated/consoleApiSource';
import { OutputMultiplexer, TerminalOutput, FileOutput } from './codegen/outputs'; import { OutputMultiplexer, TerminalOutput, FileOutput } from './codegen/outputs';
import { CodeGenerator, CodeGeneratorOutput } from './codegen/codeGenerator'; import { CodeGenerator, CodeGeneratorOutput } from './codegen/codeGenerator';
@ -30,6 +29,7 @@ import { JavaScriptLanguageGenerator, LanguageGenerator } from './codegen/langua
import { PythonLanguageGenerator } from './codegen/languages/python'; import { PythonLanguageGenerator } from './codegen/languages/python';
import { CSharpLanguageGenerator } from './codegen/languages/csharp'; import { CSharpLanguageGenerator } from './codegen/languages/csharp';
import { RecorderController } from './codegen/recorderController'; import { RecorderController } from './codegen/recorderController';
import { runServer, printApiJson, installBrowsers } from './driver';
import type { Browser, BrowserContext, Page, BrowserType, BrowserContextOptions, LaunchOptions } from '../..'; import type { Browser, BrowserContext, Page, BrowserType, BrowserContextOptions, LaunchOptions } from '../..';
import * as playwright from '../..'; import * as playwright from '../..';
@ -130,19 +130,18 @@ program
.command('install') .command('install')
.description('Ensure browsers necessary for this version of Playwright are installed') .description('Ensure browsers necessary for this version of Playwright are installed')
.action(function() { .action(function() {
let browsersJsonDir = path.dirname(process.execPath); installBrowsers().catch((e: any) => {
if (!fs.existsSync(path.join(browsersJsonDir, 'browsers.json'))) {
browsersJsonDir = path.join(__dirname, '..', '..');
if (!fs.existsSync(path.join(browsersJsonDir, 'browsers.json')))
throw new Error('Failed to find browsers.json in ' + browsersJsonDir);
}
installBrowsersWithProgressBar(browsersJsonDir).catch((e: any) => {
console.log(`Failed to install browsers\n${e}`); console.log(`Failed to install browsers\n${e}`);
process.exit(1); process.exit(1);
}); });
}); });
program.parse(process.argv); if (process.argv[2] === 'run-driver')
runServer();
else if (process.argv[2] === 'print-api-json')
printApiJson();
else
program.parse(process.argv);
type Options = { type Options = {

View file

@ -14,33 +14,26 @@
* limitations under the License. * limitations under the License.
*/ */
/* eslint-disable no-console */
import * as fs from 'fs'; import * as fs from 'fs';
import * as util from 'util'; import * as path from 'path';
import { installDebugController } from './debug/debugController'; import { installDebugController } from '../debug/debugController';
import { DispatcherConnection } from './dispatchers/dispatcher'; import { DispatcherConnection } from '../dispatchers/dispatcher';
import { PlaywrightDispatcher } from './dispatchers/playwrightDispatcher'; import { PlaywrightDispatcher } from '../dispatchers/playwrightDispatcher';
import { installBrowsersWithProgressBar } from './install/installer'; import { installBrowsersWithProgressBar } from '../install/installer';
import { Transport } from './protocol/transport'; import { Transport } from '../protocol/transport';
import { Playwright } from './server/playwright'; import { Playwright } from '../server/playwright';
import { gracefullyCloseAll } from './server/processLauncher'; import { gracefullyCloseAll } from '../server/processLauncher';
import { installHarTracer } from './trace/harTracer'; import { installHarTracer } from '../trace/harTracer';
import { installTracer } from './trace/tracer'; import { installTracer } from '../trace/tracer';
export function printApiJson() {
const readFileAsync = util.promisify(fs.readFile); console.log(JSON.stringify(require('../../api.json')));
const writeFileAsync = util.promisify(fs.writeFile);
export async function copyPrintDeps(destination: string) {
const content = await readFileAsync(require.resolve('../bin/PrintDeps.exe'));
await writeFileAsync(destination, content);
} }
export async function installWithProgressBar(location: string) { export function printProtocol() {
await installBrowsersWithProgressBar(location); console.log(fs.readFileSync(path.join(__dirname, '..', '..', 'protocol.yml'), 'utf8'));
}
export async function apiJson(): Promise<string> {
return (await readFileAsync(require.resolve('../docs/api.json'))).toString();
} }
export function runServer() { export function runServer() {
@ -62,9 +55,16 @@ export function runServer() {
process.exit(0); process.exit(0);
}; };
const playwright = new Playwright(__dirname, require('../browsers.json')['browsers']); const playwright = new Playwright(__dirname, require('../../browsers.json')['browsers']);
new PlaywrightDispatcher(dispatcherConnection.rootDispatcher(), playwright); new PlaywrightDispatcher(dispatcherConnection.rootDispatcher(), playwright);
} }
if (process.argv[2] === 'serve') export async function installBrowsers() {
runServer(); let browsersJsonDir = path.dirname(process.execPath);
if (!fs.existsSync(path.join(browsersJsonDir, 'browsers.json'))) {
browsersJsonDir = path.join(__dirname, '..', '..');
if (!fs.existsSync(path.join(browsersJsonDir, 'browsers.json')))
throw new Error('Failed to find browsers.json in ' + browsersJsonDir);
}
await installBrowsersWithProgressBar(browsersJsonDir);
}

View file

@ -108,7 +108,7 @@ fixtures.playwright.override(async ({ browserName, testWorkerIndex, platform, mo
if (mode === 'driver') { if (mode === 'driver') {
require('../lib/utils/utils').setUnderTest(); require('../lib/utils/utils').setUnderTest();
const connection = new Connection(); const connection = new Connection();
const spawnedProcess = childProcess.fork(path.join(__dirname, '..', 'lib', 'driver.js'), ['serve'], { const spawnedProcess = childProcess.fork(path.join(__dirname, '..', 'lib', 'cli', 'cli.js'), ['run-driver'], {
stdio: 'pipe', stdio: 'pipe',
detached: true, detached: true,
}); });

View file

@ -123,7 +123,7 @@ DEPS['src/server/android/'] = [...DEPS['src/server/'], 'src/server/chromium/', '
DEPS['src/server/electron/'] = [...DEPS['src/server/'], 'src/server/chromium/']; DEPS['src/server/electron/'] = [...DEPS['src/server/'], 'src/server/chromium/'];
DEPS['src/server/playwright.ts'] = [...DEPS['src/server/'], 'src/server/chromium/', 'src/server/webkit/', 'src/server/firefox/', 'src/server/android/', 'src/server/electron/']; DEPS['src/server/playwright.ts'] = [...DEPS['src/server/'], 'src/server/chromium/', 'src/server/webkit/', 'src/server/firefox/', 'src/server/android/', 'src/server/electron/'];
DEPS['src/driver.ts'] = DEPS['src/inprocess.ts'] = DEPS['src/browserServerImpl.ts'] = ['src/**']; DEPS['src/cli/driver.ts'] = DEPS['src/inprocess.ts'] = DEPS['src/browserServerImpl.ts'] = ['src/**'];
// Tracing is a client/server plugin, nothing should depend on it. // Tracing is a client/server plugin, nothing should depend on it.
DEPS['src/trace/'] = ['src/utils/', 'src/client/**', 'src/server/**']; DEPS['src/trace/'] = ['src/utils/', 'src/client/**', 'src/server/**'];