自动化测试工具Playwright使用

项目地址:GitHub - microsoft/playwright: Playwright is a framework for Web Testing and Automation. It allows testing Chromium, Firefox and WebKit with a single API.

下载Playwright

首先创建一个虚拟环境,然后再在虚拟环境中,使用pip下载Playwright包

pip install playwright

下载完成后,运行该命令将会下载所需的浏览器二进制文件,包括 Chromium、Firefox 和 WebKit。

一旦下载完成,您应该能够启动浏览器并正常执行 Playwright 脚本了。

playwright install

或者

python -m playwright install

Playwright教程

操作新建浏览器实例

这里模拟了新建一个浏览器实例,然后搜索词条,再打开这个词条,读取词条所有内容的操作

# -*- coding = utf-8 -*-
import time

from playwright.sync_api import sync_playwright
from datetime import datetime

def search(page):
    try :
        # 打开网址
        page.goto('https://www.baidu.com')
        # 根据id定位元素,并且输入内容test
        page.locator("#kw").fill("test")
        # 使用文本选择器定位包含特定文本的元素,并且点击元素
        page.locator("text='百度一下'").click()
        # 根据xpath定位元素,并且点击test百度词条
        page.locator('//*[@id="3"]/div/h3/a/div/div/p/span/span').click()
        # 如果点击的链接新打开一个窗口,定位到新打开的页面
        new_page = context.wait_for_event("page")
        # 等待页面完全加载
        new_page.wait_for_load_state('load')
        # 使用 CSS 选择器定位唯一类名的单个元素
        test_element = new_page.locator('.para_YSJB6.summary_LggeX.MARK_MODULE')
        test_text = test_element.inner_text()
        print(test_text)
    except Exception as e:
        # 获取当前时间并格式化为字符串
        timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
        # 创建截图文件名
        screenshot_filename = f'error_call/search_{timestamp}.png'
        # 保存截图
        page.screenshot(path=screenshot_filename)
        # 记录调用日志,以便后续分析
        with open(f'error_call/search_{timestamp}.txt', 'w') as f:
            f.write(str(e))



if __name__ == '__main__':
    playwright = sync_playwright().start()
    # browser = playwright.chromium.connect_over_cdp("http://127.0.0.1:9222")
    # 使用with 语句运行 Playwright,同步启动和关闭 Playwright 实例。
    with playwright.chromium.connect_over_cdp("http://127.0.0.1:9222") as browser:
        # 通过9222端口连接到本地浏览器
        # browser = playwright.chromium.connect_over_cdp("http://127.0.0.1:9222")
        print(f"连接到本地浏览器状态:{browser.is_connected()}")
        # 创建一个新的浏览器上下文。浏览器上下文类似于一个新的浏览器实例,它们之间互相隔离。
        context = browser.contexts[0]
        page = context.new_page()
        # 执行登录操作,search 函数中包含具体的搜索逻辑。
        search(page)
        # 关闭页面
        page.close()
        # 关闭浏览器上下文
        context.close()

连接到本地浏览器实例

这里模拟了连接到本地浏览器实例,然后搜索词条,再打开这个词条,读取词条所有内容的操作

在连接浏览器之前,需要先打开浏览器的远程调试端口9222,如果打开的是谷歌浏览器,可以在终端中用这个命令

open -a "Google Chrome" --args --remote-debugging-port=9222
# -*- coding = utf-8 -*-
import time

from playwright.sync_api import sync_playwright
from datetime import datetime

def search(page):
    try :
        # 打开网址
        page.goto('https://www.baidu.com')
        # 根据id定位元素,并且输入内容test
        page.locator("#kw").fill("test")
        # 使用文本选择器定位包含特定文本的元素,并且点击元素
        page.locator("text='百度一下'").click()
        # 根据xpath定位元素,并且点击test百度词条
        page.locator('//*[@id="3"]/div/h3/a/div/div/p/span/span').click()
        # 如果点击的链接新打开一个窗口,定位到新打开的页面
        new_page = context.wait_for_event("page")
        # 等待页面完全加载
        new_page.wait_for_load_state('load')
        # 使用 CSS 选择器定位唯一类名的单个元素
        test_element = new_page.locator('.para_YSJB6.summary_LggeX.MARK_MODULE')
        test_text = test_element.inner_text()
        print(test_text)
    except Exception as e:
        # 获取当前时间并格式化为字符串
        timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
        # 创建截图文件名
        screenshot_filename = f'error_call/search_{timestamp}.png'
        # 保存截图
        page.screenshot(path=screenshot_filename)
        # 记录调用日志,以便后续分析
        with open(f'error_call/search_{timestamp}.txt', 'w') as f:
            f.write(str(e))



if __name__ == '__main__':
    playwright = sync_playwright().start()
    # browser = playwright.chromium.connect_over_cdp("http://127.0.0.1:9222")
    # 使用with 语句运行 Playwright,同步启动和关闭 Playwright 实例。
    with playwright.chromium.connect_over_cdp("http://127.0.0.1:9222") as browser:
        # 通过9222端口连接到本地浏览器
        # browser = playwright.chromium.connect_over_cdp("http://127.0.0.1:9222")
        print(f"连接到本地浏览器状态:{browser.is_connected()}")
        # 创建一个新的浏览器上下文。浏览器上下文类似于一个新的浏览器实例,它们之间互相隔离。
        context = browser.contexts[0]
        page = context.new_page()
        # 执行登录操作,search 函数中包含具体的搜索逻辑。
        search(page)
        # 关闭页面
        page.close()
        # 关闭浏览器上下文
        context.close()