如何使用代理方式打开网页
在 playwright.chromium.launch() 中传入 proxy 参数即可,示例代码如下:
1、同步写法:
from playwright.sync_api import sync_playwright proxy = {'server': 'http:/127.0.0.1:8080'} def run(): with sync_playwright() as p: browser = p.chromium.launch(headless=False, proxy=proxy) page = browser.new_page() page.goto('https://www.baidu.com') title = page.title() if "百度" in title: print("打开百度成功") else: print("打开百度失败") browser.close() run()
2、异步写法:
from playwright.async_api import async_playwright import asyncio proxy = {'server': 'http:/127.0.0.1:8080'} async def run(): async with async_playwright() as p: browser = await p.chromium.launch(headless=False, proxy=proxy) page = await browser.new_page() await page.goto('https://www.baidu.com') title = await page.title() if "百度" in title: print("打开百度成功") else: print("打开百度失败") await browser.close() asyncio.get_event_loop().run_until_complete(run())
同步和异步写法对比
1、同步的优点:
- 代码结构简单易懂,不需要学习async/await语法
- 适用于小规模或简单任务
- 调试和理解同步代码更简单
2、异步的优点:
- 能更高效地利用系统资源,避免阻塞等待IO
- 对于长时间操作如网络请求更高效
- 可以支持并发执行多个任务
- 对于大规模和复杂系统更有利
3、区别
- 对于小任务和学习用途,同步代码结构更简单。
- 对于需要长时间IO等待的任务(如网络请求),使用异步可以更高效。
- 对于需要支持高并发的系统(如网站),使用异步模型可以支持更多并发连接。
- 多线程同步会带来锁的问题,而异步避免了锁的使用。
- 异步的FUTURE模式也更易于扩展性好,支持动态增加回调函数。
4、总结
- 小任务用同步
- 长时间IO任务用异步
- 高并发系统用异步
- 以后的功能扩展考虑异步更灵活
一般来说对于现代化系统,异步编程模型将是主流趋势。但同步在某些场景也同样易用。选择时要根据具体需求来权衡。
写一个自动化测试脚本
1、示例脚本
算是个入门的例子,关于每句话的意思,看我注释即可,示例代码如下:
import re from playwright.sync_api import Page, expect, sync_playwright proxy = {'server': 'http://127.0.0.1:8080'} def test_baidu(): with sync_playwright() as p: browser = p.chromium.launch(headless=False, proxy=proxy) page = browser.new_page() # 跳转到baidu页面 page.goto("https://www.baidu.com/") # 点击输入框 page.locator("#kw").click() # 输入框输入selenium page.locator("#kw").fill("selenium") # 点击百度一下查询按钮 page.get_by_role("button", name="百度一下").click() # 验证输入框是否输入selenium expect(page.locator("#kw")).to_have_value("selenium") # 验证页面是否包含文本“大家还在搜” expect(page.locator("#content_left")).to_contain_text("大家还在搜") # 退出浏览器 browser.close()
注意:测试类和测试方法都要用test_ 前缀命名
2、基本操作
这是 Playwright 常用操作列表,请注意,还有许多其他操作,请务必查看定位器 API 部分以了解更多相关信息。
locator.check() # 选中输入复选框 locator.click() # 点击元素 locator.uncheck() # 取消选中输入复选框 locator.hover() # 将鼠标悬停在元素上 locator.fill() # 填写表单字段,输入文本 locator.focus() # 聚焦元素 locator.press() # 按下单个键 locator.set_input_files() # 选择要上传的文件 locator.select_option() # 从下拉菜单中选择选项
3、断言操作
expect(locator).to_be_checked() # 复选框处于选中状态 expect(locator).to_be_enabled() # 控件已启用 expect(locator).to_be_visible() # 元素可见 expect(locator).to_contain_text() # 元素包含文本 expect(locator).to_have_attribute() # 元素具有属性 expect(locator).to_have_count() # 元素列表已给出长度 expect(locator).to_have_text() # 元素匹配文本 expect(locator).to_have_value() # 输入元素具有值 expect(page).to_have_title() # 页面有标题 expect(page).to_have_url() # 页面有 URL
4、fixtures夹具的使用
示例代码:
import pytest from playwright.sync_api import Page, expect, sync_playwright @pytest.fixture(scope="function", autouse=True) def before_each_after_each(page: Page): print("before the test runs") page.goto("https://www.baidu.com/") yield print("after the test runs") def test_main_navigation(page: Page): page.locator("#kw").fill("万物皆可连 博客园") page.get_by_role("button", name="百度一下").click() expect(page.locator("#content_left")).to_contain_text("万物皆可连 - 博客园")
代码解释:
定义了一个名为 before_each_after_each 的 fixture(夹具),它的作用域是每个测试函数,并且设置为自动应用于每个测试函数。
在这个 fixture 中:打印 "before the test runs",表示测试运行前执行的操作。使用 page.goto("https://www.baidu.com/") 打开百度首页。
yield 关键字在这个 fixture 运行期间挂起,等待测试函数执行。测试函数将在 fixture 的环境下执行。
标签:异步,Playwright,Python,手把手,locator,playwright,expect,page,proxy From: https://www.cnblogs.com/zhuuque23/p/18301976