فهرست منبع

fixed early disconnect issue (#371)

Former-commit-id: a154a8a32bf38f8f1122c77b66467a8cc245fc6d
Gildas 5 سال پیش
والد
کامیت
cb46117d28
5فایلهای تغییر یافته به همراه44 افزوده شده و 32 حذف شده
  1. 11 6
      cli/back-ends/puppeteer-firefox.js
  2. 7 6
      cli/back-ends/puppeteer.js
  3. 11 10
      cli/back-ends/webdriver-chromium.js
  4. 11 10
      cli/back-ends/webdriver-gecko.js
  5. 4 0
      cli/single-file

+ 11 - 6
cli/back-ends/puppeteer-firefox.js

@@ -29,26 +29,31 @@ const scripts = require("./common/scripts.js");
 const EXECUTION_CONTEXT_DESTROYED_ERROR = "Execution context was destroyed";
 const NETWORK_IDLE_STATE = "networkidle0";
 
-let browser, pendings = 0;
+let browser;
 
 exports.initialize = async options => {
 	browser = await puppeteer.launch(getBrowserOptions(options));
 };
 
 exports.getPageData = async options => {
+	let page;
 	try {
-		pendings++;
-		const page = await browser.newPage();
+		page = await browser.newPage();
 		await setPageOptions(page, options);
 		return await getPageData(browser, page, options);
 	} finally {
-		pendings--;
-		if (!pendings && browser && !options.browserDebug) {
-			await browser.close();
+		if (page) {
+			await page.close();
 		}
 	}
 };
 
+exports.closeBrowser = () => {
+	if (browser) {
+		return browser.close();
+	}
+};
+
 function getBrowserOptions(options) {
 	const browserOptions = {};
 	if (options.browserHeadless !== undefined) {

+ 7 - 6
cli/back-ends/puppeteer.js

@@ -30,7 +30,7 @@ const EXECUTION_CONTEXT_DESTROYED_ERROR = "Execution context was destroyed";
 const NETWORK_IDLE_STATE = "networkidle0";
 const NETWORK_STATES = ["networkidle0", "networkidle2", "load", "domcontentloaded"];
 
-let browser, pendings = 0;
+let browser;
 
 exports.initialize = async options => {
 	browser = await puppeteer.launch(getBrowserOptions(options));
@@ -39,18 +39,19 @@ exports.initialize = async options => {
 exports.getPageData = async options => {
 	let page;
 	try {
-		pendings++;
 		page = await browser.newPage();
 		await setPageOptions(page, options);
 		return await getPageData(browser, page, options);
 	} finally {
-		pendings--;
 		if (page) {
 			await page.close();
 		}
-		if (!pendings && browser && !options.browserDebug) {
-			await browser.close();
-		}
+	}
+};
+
+exports.closeBrowser = () => {
+	if (browser) {
+		return browser.close();
 	}
 };
 

+ 11 - 10
cli/back-ends/webdriver-chromium.js

@@ -28,19 +28,20 @@ const path = require("path");
 const chrome = require("selenium-webdriver/chrome");
 const { Builder } = require("selenium-webdriver");
 
+let driver;
+
 exports.initialize = async () => { };
 
 exports.getPageData = async options => {
-	let driver;
-	try {
-		const builder = new Builder();
-		builder.setChromeOptions(getBrowserOptions(options));
-		driver = builder.forBrowser("chrome").build();
-		return await getPageData(driver, options);
-	} finally {
-		if (driver && !options.browserDebug) {
-			driver.quit();
-		}
+	const builder = new Builder();
+	builder.setChromeOptions(getBrowserOptions(options));
+	driver = builder.forBrowser("chrome").build();
+	return await getPageData(driver, options);
+};
+
+exports.closeBrowser = () => {
+	if (driver) {
+		return driver.quit();
 	}
 };
 

+ 11 - 10
cli/back-ends/webdriver-gecko.js

@@ -28,19 +28,20 @@ const path = require("path");
 const firefox = require("selenium-webdriver/firefox");
 const { Builder, By, Key } = require("selenium-webdriver");
 
+let driver;
+
 exports.initialize = async () => { };
 
 exports.getPageData = async options => {
-	let driver;
-	try {
-		const builder = new Builder().withCapabilities({ "pageLoadStrategy": "none" });
-		builder.setFirefoxOptions(getBrowserOptions(options));
-		driver = builder.forBrowser("firefox").build();
-		return await getPageData(driver, options);
-	} finally {
-		if (driver && !options.browserDebug) {
-			driver.quit();
-		}
+	const builder = new Builder().withCapabilities({ "pageLoadStrategy": "none" });
+	builder.setFirefoxOptions(getBrowserOptions(options));
+	driver = builder.forBrowser("firefox").build();
+	return await getPageData(driver, options);
+};
+
+exports.closeBrowser = () => {
+	if (driver) {
+		return driver.quit();
 	}
 };
 

+ 4 - 0
cli/single-file

@@ -196,6 +196,10 @@ backend.initialize(args).then(() => {
 		tasks = [{ url: rewriteURL(args.url, args.urlRewriteRules), depth: 0 }];
 	}
 	return runTasks(tasks, args);
+}).then(() => {
+	if (!args.browserDebug) {
+		return backend.closeBrowser();
+	}
 });
 
 async function runTasks(tasks, options) {