stepwright
Version:
A powerful web scraping library built with Playwright
228 lines • 6.35 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getData = exports.clickCheckBox = exports.doubleClick = exports.click = exports.input = exports.elem = exports.navigate = exports.getBrowser = void 0;
const playwright_1 = require("playwright");
/**
* Get the browser and page.
*
* @param {object} params - The browser params.
*
* @since v1.0.0
* @author Muhammad Umer Farooq <umer@lablnet.com>
*
* @returns {object} - The browser.
* @since v1.0.0
* @company Framework Island
*/
const getBrowser = async (params = {}) => {
const browser = await playwright_1.chromium.launch(params);
return browser;
};
exports.getBrowser = getBrowser;
/**
* Wait for the given time.
*
* @param {number} wait - The time to wait.
*
* @since v1.0.0
* @author Muhammad Umer Farooq <umer@lablnet.com>
*
* @returns {object} - The browser and page.
* @since v1.0.0
* @company Framework Island
*/
const _wait = (wait) => new Promise((resolve) => setTimeout(resolve, wait));
/**
* Navigate to the given url.
*
* @param {object} page - The page object.
* @param {string} url - The url to navigate.
* @param {number} wait - The time to wait.
*
* @since v1.0.0
* @author Muhammad Umer Farooq <umer@lablnet.com>
*
* @returns {object} - The page object.
* @since v1.0.0
* @company Framework Island
*/
const navigate = async (page, url, wait = 0) => {
// validate the url.
if (!url)
throw new Error('Url is required');
// navigate to the url.
await page.goto(url, { waitUntil: 'networkidle' });
// wait for the given time.
if (wait > 0)
await _wait(wait);
// return the page.
return page;
};
exports.navigate = navigate;
/**
* Get the element.
*
* @param {object} page - The page object.
* @param {string} type - The type of selector.
* @param {string} selector - The selector.
*
* @since v1.0.0
* @author Muhammad Umer Farooq <umer@lablnet.com>
*
* @returns {object} - The element.
* @since v1.0.0
* @company Framework Island
*/
const elem = async (page, type, selector, wait = 0) => {
let element = page;
if (!selector)
throw new Error('Selector is required');
// ID, CLASS, TAG, XPATH, and, Attribute.
switch (type) {
case 'id':
element = page.locator(`#${selector}`);
break;
case 'class':
element = page.locator(`.${selector}`);
break;
case 'tag':
element = page.locator(selector);
break;
case 'xpath':
element = page.locator(`xpath=${selector}`);
break;
default:
throw new Error('Invalid selector type');
}
if (wait > 0) {
await page.waitForTimeout(wait);
}
if (!element) {
throw new Error('Element not found');
}
// Type assertion since we know it's a Locator after processing
return element;
};
exports.elem = elem;
/**
* Input the value in the given selector.
*
* @param {object} page - The page object.
* @param {string} type - The type of selector.
* @param {string} selector - The selector.
* @param {string} value - The value to input.
*
* @since v1.0.0
* @author Muhammad Umer Farooq <umer@lablnet.com>
*
* @returns {object} - The page object.
* @since v1.0.0
* @company Framework Island
*/
const input = async (page, type, selector, value, wait = 0) => {
const element = await elem(page, type, selector, wait);
await element.type(value);
return page;
};
exports.input = input;
/**
* Click on the given selector.
*
* @param {object} page - The page object.
* @param {string} type - The type of selector.
* @param {string} selector - The selector.
*
* @since v1.0.0
* @author Muhammad Umer Farooq <umer@lablnet.com>
*
* @returns {object} - The page object.
* @since v1.0.0
* @company Framework Island
*/
const click = async (page, type, selector) => {
const element = await elem(page, type, selector);
await element.click();
return page;
};
exports.click = click;
/**
* Double click on the given selector.
*
* @param {object} page - The page object.
* @param {string} type - The type of selector.
* @param {string} selector - The selector.
*
* @since v1.0.0
* @author Muhammad Umer Farooq <umer@lablnet.com>
*
* @returns {object} - The page object.
* @since v1.0.0
* @company Framework Island
*/
const doubleClick = async (page, type, selector) => {
const element = await elem(page, type, selector);
await element.dblclick();
return page;
};
exports.doubleClick = doubleClick;
/**
* Click on the checkbox.
*
* @param {object} page - The page object.
* @param {string} type - The type of selector.
* @param {string} selector - The selector.
*
* @since v1.0.0
* @author Muhammad Umer Farooq <umer@lablnet.com>
*
* @returns {object} - The page object.
* @since v1.0.0
* @company Framework Island
*/
const clickCheckBox = async (page, type, selector) => {
const element = await elem(page, type, selector);
await element.check();
return page;
};
exports.clickCheckBox = clickCheckBox;
/**
* Get the data from the given selector.
*
* @param {object} page - The page object.
* @param {string} type - The type of selector.
* @param {string} selector - The selector.
* @param {string} data_type - The type of data to get.
*
* @since v1.0.0
* @author Muhammad Umer Farooq <umer@lablnet.com>
*
* @returns {string} - The data.
* @since v1.0.0
* @company Framework Island
*/
const getData = async (page, type, selector, data_type = 'default', wait = 0) => {
try {
const element = await elem(page, type, selector, wait);
// Check if element exists before trying to get data
const count = await element.count();
if (count === 0) {
return '';
}
switch (data_type) {
case 'text':
return (await element.textContent()) ?? '';
case 'html':
return await element.innerHTML();
case 'value':
return await element.inputValue();
default:
return await element.innerText();
}
}
catch (error) {
// Return empty string if element is not found
return '';
}
};
exports.getData = getData;
//# sourceMappingURL=scraper.js.map