目录

目录

Playwright 基础教程 01

目录
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  # 获取新窗口对象