playwright的一些封装思想

1:同步api的简单封装

from playwright.sync_api import sync_playwright

class BrowserAutomation:
    def __init__(self, browser_type='chromium'):
        self.browser_type = browser_type
        self.browser = None
        self.page = None
        self.playwright = None

    def start_browser(self, headless=True):
        self.playwright = sync_playwright().start()
        if self.browser_type == 'chromium':
            self.browser = self.playwright.chromium.launch(headless=headless)
        elif self.browser_type == 'firefox':
            self.browser = self.playwright.firefox.launch(headless=headless)
        elif self.browser_type == 'webkit':
            self.browser = self.playwright.webkit.launch(headless=headless)
        else:
            raise ValueError(f"Unsupported browser type: {self.browser_type}")

    def new_page(self):
        if not self.browser:
            raise RuntimeError("Browser is not started. Call start_browser() first.")
        self.page = self.browser.new_page()

    def close_browser(self):
        if self.browser:
            self.browser.close()
        if self.playwright:
            self.playwright.stop()

    def goto(self, url):
        if not self.page:
            raise RuntimeError("No page is open. Call new_page() first.")
        self.page.goto(url)

    def click(self, selector):
        if not self.page:
            raise RuntimeError("No page is open. Call new_page() first.")
        self.page.click(selector)

    def fill(self, selector, text):
        if not self.page:
            raise RuntimeError("No page is open. Call new_page() first.")
        self.page.fill(selector, text)

    def get_text(self, selector):
        if not self.page:
            raise RuntimeError("No page is open. Call new_page() first.")
        return self.page.inner_text(selector)

    def take_screenshot(self, path):
        if not self.page:
            raise RuntimeError("No page is open. Call new_page() first.")
        self.page.screenshot(path=path)

# 示例用法
if __name__ == "__main__":
    automation = BrowserAutomation(browser_type='chromium')
    automation.start_browser(headless=False)
    automation.new_page()
    automation.goto("https://example.com")
    automation.click("text=More information")
    automation.fill("input[name='q']", "Playwright Python")
    print(automation.get_text("h1"))
    automation.take_screenshot("example.png")
    automation.close_browser()

2:异步的简单封装

import asyncio
from playwright.async_api import async_playwright

class AsyncBrowserAutomation:
    def __init__(self, browser_type='chromium'):
        self.browser_type = browser_type
        self.browser = None
        self.page = None
        self.playwright = None

    async def start_browser(self, headless=True):
        self.playwright = await async_playwright().start()
        if self.browser_type == 'chromium':
            self.browser = await self.playwright.chromium.launch(headless=headless)
        elif self.browser_type == 'firefox':
            self.browser = await self.playwright.firefox.launch(headless=headless)
        elif self.browser_type == 'webkit':
            self.browser = await self.playwright.webkit.launch(headless=headless)
        else:
            raise ValueError(f"Unsupported browser type: {self.browser_type}")

    async def new_page(self):
        if not self.browser:
            raise RuntimeError("Browser is not started. Call start_browser() first.")
        self.page = await self.browser.new_page()

    async def close_browser(self):
        if self.page:
            await self.page.close()
        if self.browser:
            await self.browser.close()
        if self.playwright:
            await self.playwright.stop()

    async def goto(self, url):
        if not self.page:
            raise RuntimeError("No page is open. Call new_page() first.")
        await self.page.goto(url)

    async def click(self, selector):
        if not self.page:
            raise RuntimeError("No page is open. Call new_page() first.")
        await self.page.click(selector)

    async def fill(self, selector, text):
        if not self.page:
            raise RuntimeError("No page is open. Call new_page() first.")
        await self.page.fill(selector, text)

    async def get_text(self, selector):
        if not self.page:
            raise RuntimeError("No page is open. Call new_page() first.")
        return await self.page.inner_text(selector)

    async def take_screenshot(self, path):
        if not self.page:
            raise RuntimeError("No page is open. Call new_page() first.")
        await self.page.screenshot(path=path)

# 示例用法
async def main():
    automation = AsyncBrowserAutomation(browser_type='chromium')
    await automation.start_browser(headless=False)
    await automation.new_page()
    await automation.goto("https://example.com")
    await automation.click("text=More information")
    await automation.fill("input[name='q']", "Playwright Python")
    text = await automation.get_text("h1")
    print(text)
    await automation.take_screenshot("example.png")
    await automation.close_browser()

if __name__ == "__main__":
    asyncio.run(main())

3:同步with...as的会话机制的封装

from playwright.sync_api import sync_playwright

class BrowserAutomation:
    def __init__(self, browser_type='chromium'):
        self.browser_type = browser_type
        self.browser = None
        self.page = None
        self.playwright = None

    def __enter__(self):
        self.playwright = sync_playwright().start()
        if self.browser_type == 'chromium':
            self.browser = self.playwright.chromium.launch(headless=False)
        elif self.browser_type == 'firefox':
            self.browser = self.playwright.firefox.launch(headless=False)
        elif self.browser_type == 'webkit':
            self.browser = self.playwright.webkit.launch(headless=False)
        else:
            raise ValueError(f"Unsupported browser type: {self.browser_type}")
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        if self.page:
            self.page.close()
        if self.browser:
            self.browser.close()
        if self.playwright:
            self.playwright.stop()

    def new_page(self):
        self.page = self.browser.new_page()

    def goto(self, url):
        self.page.goto(url)

    def click(self, selector):
        self.page.click(selector)

    def fill(self, selector, text):
        self.page.fill(selector, text)

    def get_text(self, selector):
        return self.page.inner_text(selector)

    def take_screenshot(self, path):
        self.page.screenshot(path=path)

# 示例用法
if __name__ == "__main__":
    with BrowserAutomation(browser_type='chromium') as automation:
        automation.new_page()
        automation.goto("https://example.com")
        automation.click("text=More information")
        automation.fill("input[name='q']", "Playwright Python")
        print(automation.get_text("h1"))
        automation.take_screenshot("example.png")

4:异步的会话机制封装:

import asyncio
from playwright.async_api import async_playwright

class AsyncBrowserAutomation:
    def __init__(self, browser_type='chromium'):
        self.browser_type = browser_type
        self.browser = None
        self.page = None
        self.playwright = None

    async def __aenter__(self):
        self.playwright = await async_playwright().start()
        if self.browser_type == 'chromium':
            self.browser = await self.playwright.chromium.launch(headless=False)
        elif self.browser_type == 'firefox':
            self.browser = await self.playwright.firefox.launch(headless=False)
        elif self.browser_type == 'webkit':
            self.browser = await self.playwright.webkit.launch(headless=False)
        else:
            raise ValueError(f"Unsupported browser type: {self.browser_type}")
        return self

    async def __aexit__(self, exc_type, exc_value, traceback):
        if self.page:
            await self.page.close()
        if self.browser:
            await self.browser.close()
        if self.playwright:
            await self.playwright.stop()

    async def new_page(self):
        self.page = await self.browser.new_page()

    async def goto(self, url):
        await self.page.goto(url)

    async def click(self, selector):
        await self.page.click(selector)

    async def fill(self, selector, text):
        await self.page.fill(selector, text)

    async def get_text(self, selector):
        return await self.page.inner_text(selector)

    async def take_screenshot(self, path):
        await self.page.screenshot(path=path)

# 示例用法
async def main():
    async with AsyncBrowserAutomation(browser_type='chromium') as automation:
        await automation.new_page()
        await automation.goto("https://example.com")
        await automation.click("text=More information")
        await automation.fill("input[name='q']", "Playwright Python")
        text = await automation.get_text("h1")
        print(text)
        await automation.take_screenshot("example.png")

if __name__ == "__main__":
    asyncio.run(main())

 

posted @ 2024-06-25 10:30  苦逼小李  阅读(292)  评论(0)    收藏  举报