Playwright 基础教程 01
pip install playwright
playwright install服务器
~/.venvs/main/bin/pip install playwright
~/.venvs/main/bin/playwright install-deps
~/.venvs/main/bin/playwright installfrom playwright.sync_api import sync_playwright
def run():
with sync_playwright() as p:
# 启动一个 Chromium 浏览器,不隐藏窗口(headless=False 表示浏览器窗口会显示出来)
browser = p.chromium.launch(headless=False)
# 新建一个页面
page = browser.new_page()
# 打开指定的网址
page.goto("https://baidu.com")
page.pause()
# 稍等三秒钟,让你看看打开的网页
page.wait_for_timeout(3000)
# 关闭浏览器
browser.close()
if __name__ == "__main__":
run()等待 1 秒钟
page.wait_for_timeout(1000)locator: 可以用来选择元素
fill: 输入文本
clear: 清楚文本框
input_value: 获取文本框内容
click: 点击
dblclick: 双击
inner_text: 获取可见文本,注意,只能应对单个元素
all_inner_texts: 获取所有可见文本
text_content: 获取所有内容(包括被隐藏的)
get_attribute: 获取属性值
inner_html: 获取 HTML 文本
count: 获取元素数量
first.inner_text() / last.inner_text() / nth
wait_for: 等待元素可见(参数>visible 等待可见,hidden 等待消失)返回元素
is_visible 是否可见,返回 True/False
page.locator('#kw').fill('通讯')
page.locator('#go').click()
locators = page.locator('div').all()
for one in locators:
print(one.inner_text())
texts = page.locator('div').all_inner_texts()
print('textContent:', lc.text_content())
count = page.locator('.plant').count()
lct = page.locator('.plant')
print(lct.first.inner_text(), lct.last.inner_text())
print(lct.nth(1).inner_text())
# 等待元素可见
page.locator("#source").wait_for()文件输入框
# 先定位
lc = page.locator('input[type=file]')
# 单选一个文件
lc.set_input_files('d:/1.png')
# 或者 多选 文件
lc.set_input_files(['d:/1.png', 'd:/2.jpg'])单选/多选
点击单选 radio 使用 check
取消选择 radio 使用 uncheck
判断是否选中 is_checked
# 获取当前选中的元素
lcs = page.locator('#s_radio input[name="teacher"]:checked').all()
teachers = [lc.get_attribute('value') for lc in lcs ]
print('当前选中的是:', ' '.join(teachers))
# 确保点选 小雷老师
page.locator("#s_radio input[value='小雷老师']").check()select 单选框
select_option
# 根据 索引 选择, 从0 开始, 但是为0的时候,好像有bug
page.locator('#ss_single').select_option(index=1)
# 根据 value属性 选择
page.locator('#ss_single').select_option(value='小江老师')
# 根据 选项文本 选择
page.locator('#ss_single').select_option(label='小江老师')
# 清空所有选择
page.locator('#ss_single').select_option([])select 多选框
# 根据 value属性 或者 选项文本 多选
page.locator('#ss_multi').select_option(['小江老师', '小雷老师'])
# 根据 value属性 多选
page.locator('#ss_multi').select_option(value=['小江老师', '小雷老师'])
# 根据 选项文本 多选
page.locator('#ss_multi').select_option(label=['小江老师', '小雷老师'])
# 清空所有选择
page.locator('#ss_multi').select_option([])
# 获取选中选项
page.locator('#ss_multi option:checked').all_inner_texts()网页操作
要 打开网址/刷新/前进/后退 , 可以分别调用 Page 对象的 goto/reload/go_back/go_forward 方法
要 获取整个网页对应的 HTML , 可以调用 Page 对象的 content 方法
要 获取整个网页的标题栏文本 , 可以调用 Page 对象的 title 方法
要 设置页面大小 , 可以调用 Page 对象的 set_viewport_size 方法
page.set_viewport_size({"width": 640, "height": 480})多窗口操作
from playwright.sync_api import sync_playwright
pw = sync_playwright().start()
browser = pw.chromium.launch(headless=False)
# 创建 BrowserContext 对象
context = browser.new_context()
# 通过context 创建page
page = context.new_page()
page.goto("https://www.byhy.net/cdn2/files/selenium/sample3.html")
# 点击链接,打开新窗口
page.locator("a").click()
# 等待2秒, 不能用 time.sleep
page.wait_for_timeout(2000)
# pages属性是 所有窗口对应Page对象的列表
newPage = context.pages[1]
# 打印新网页窗口标题
print(newPage.title())
# 打印老网页窗口标题
print(page.title())for pg in context.pages:
# 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口
if '必应' in pg.title():
break
print(pg.title())如果当前界面有很多窗口,要把某个窗口作为当前活动窗口显示出来,可以调用该窗口对应的 Page 对象的 bring_to_front 方法。
如果只是要关闭某个网页窗口,可以调用该窗口对应的 Page 对象的 close 方法。
Debugger
在 开发者工具栏 console 里面执行如下 js 代码
setTimeout(function(){debugger}, 5000)这句代码什么意思呢?
表示在 5000 毫秒后,执行 debugger 命令
执行该命令会 浏览器会进入 debug 状态。 debug 状态有个特性, 界面被冻住, 不管我们怎么点击界面都不会触发事件。
所以,我们可以在输入上面代码并回车 执行后, 立即 鼠标放在界面 右上角 更多产品处。
这时候,就会弹出 下面的 图标。
然后,我们仔细等待 5 秒 到了以后, 界面就会因为执行了 debugger 命令而被冻住。
然后,我们就可以点击 开发者工具栏的 查看箭头, 再去 点击 音乐 图标 ,查看其属性了。
截屏
# 截屏当前页面可见内容,保存到当前工作目录下的ss1.png文件中
page.screenshot(path='ss1.png')
# 截屏 完整页面,页面内容长度超过窗口高度时,包括不可见部分。
page.screenshot(path='ss1.png', full_page=True)
# 也可以只对 某个元素的显示内容 进行截屏,使用 Locator 对象的 screenshot 方法。
page.locator('input[type=file]').screenshot(path='ss2.png')拖拽
# 选中 `span#t1` 文本内容
page.locator('#t1').select_text()
# 拖拽到 输入框 `[placeholder="captcha"]` 里面去
page.drag_and_drop('#t1', '[placeholder="captcha"]')# 选中 `span#t1` 文本内容
lc = page.locator('#t1')
lc.select_text()
# 拖拽到 输入框 `[placeholder="captcha"]` 里面去
lc.drag_to(page.locator('[placeholder="captcha"]'))Alert 对话框
from playwright.sync_api import sync_playwright
pw = sync_playwright().start()
browser = pw.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://www.byhy.net/cdn2/files/selenium/test4.html")
# 处理 弹出对话框 的 回调函数
def handleDlg(dialog):
# 等待1秒
page.wait_for_timeout(1000)
# 点击确定
# `dismiss` 取消
dialog.accept()
# 打印 弹出框 提示信息
print(dialog.message)
# 设置弹出对话框事件回调函数
page.on("dialog", handleDlg )
# 点击 alert 按钮
page.locator('#b1').click()Prompt 对话框 输入信息的对话框
from playwright.sync_api import sync_playwright
pw = sync_playwright().start()
browser = pw.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://www.byhy.net/cdn2/files/selenium/test4.html")
def handleDlg(dialog):
page.wait_for_timeout(1000)
dialog.accept('你好啊') # 输入信息,并确定
page.on("dialog", handleDlg)
# 点击 confirm 按钮
page.locator('#b3').click()
input('....')1 异步
import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False) # 启动浏览器
context = await browser.new_context() # 创建上下文(可共享 Cookie)
page1 = await context.new_page()
page2 = await context.new_page()
await page1.goto("https://baidu.com")
await page2.goto("https://bilibili.dev")
print("Page 1 标题:", await page1.title())
print("Page 2 标题:", await page2.title())
await page1.wait_for_timeout(5000)
await browser.close()
asyncio.run(main())监听点击打开的新窗口
# 监听新窗口
async with context.expect_page() as new_page_info:
await page.click("a[target='_blank']") # 点击会打开新窗口的链接
new_page = await new_page_info.value # 获取新窗口对象