pip install playwright
playwright install
服务器
~/.venvs/main/bin/pip install playwright
~/.venvs/main/bin/playwright install-deps
~/.venvs/main/bin/playwright install
from 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('....')
异步
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 # 获取新窗口对象