Playwright 入门详细教程

这篇具有很好参考价值的文章主要介绍了Playwright 入门详细教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

playwright的python文档

安装

pip install playwright

# 安装驱动, 支持的浏览器:cr, chromium, ff, firefox, wk 和 webkit
playwright install

控制台启动录制

playwright codegen [options] [url]
  • -o, --output :保存生成脚本
  • –target :生成的脚本语言,可以设置javascript, test, python, python-async和csharp,默认为python
  • -b, --browser :要使用的浏览器,可以选择cr, chromium, ff, firefox, wk和webkit,默认chromium。
  • –channel :chromium版本,比如chrome, chrome-beta, msedge-dev等
  • –color-scheme :模拟器的颜色主题,可选择light 或者 dark样式
  • –device :模拟的设备
  • –save-storage :保存上下文状态,用于保存cookies 和localStorage,可用它来实现重用。例如playwright codegen --save-storage=auth.json
  • –load-storage :加载–save-storage 保存的数据,重用认证数据。
  • –proxy-server :指定代理服务器
  • –timezone
  • –geolocation :指定地理位置坐标
  • –lang :指定语言/地区,比如中国大陆:zh-CN
  • –timeout :超时时间,定位毫秒,默认10000ms
  • –user-agent :用户代理
  • –viewport-size :浏览器窗口大小
  • -h, --help :查看帮助信息

例如:

playwright codegen -o test_playwright.py --target python  -b chromium --device="iPhone 12 Pro" https://www.baidu.com/

playwright open https://www.baidu.com/ # 默认使用Chromium打开
playwright wk https://www.baidu.com/ # 使用WebKit打开
playwright open --device="iPhone 12 Pro" https://www.baidu.com/ # 使用iPhone 12 Pro模拟器打开

基本用法

常见配置参数

headless,slow_mo,viewport,locale,timezone,color_scheme,geolocation,user_agent, timeout, proxy

同步模式

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
	# 创建一个浏览器实例; headless:是否无头;slow_mo放慢执行速度
	
	# pixel_2 = playwright.devices['Pixel 2']  # Pixel 2 一款安卓手机
	proxy_ip = {
            'server': 'http://',
            'username': '',
            'password': '',
        }
    browser = p.chromium.launch(headless=False, slow_mo=100, proxy=proxy_ip)
	context = browser.new_context(
            viewport={'width': 1800, 'height': 800},	# 窗口大小
            locale='zh-CN',  #语言zh-CN/en-EN
            timezone='Europe/Rome',   #时区
            color_scheme='dark',	# 颜色
            geolocation={"longitude": 48.858455, "latitude": 2.294474} # 地理位置
            user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36', # 浏览器,
            timeout=10000, # 超时
            # **pixel_2,
        )
	
    # 创建两个浏览器上下文
    page = browser.new_page()
    page.goto('http://www.baidu.com')
    print(page.title)
    browser.close()

异步模式

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)
        page = await browser.new_page()
        await page.goto("http://www.baidu.com")
        print(await page.title())
        await browser.close()

asyncio.run(main())

防止WebDriver 被检测

js = """
Object.defineProperties(navigator,{webdriver:{get:()=>undefined}};
"""
page.add_init_script(js)

或者
page.add_init_script("""Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});""")

获取源码,文本,属性

获取源码: .content()
page.wait_for_load_state('networkidle')
html = page.content()
获取文本: .text_content()
# ul->li下
brand = element.query_selector('text=品牌:').text_content()

name = ele_items.query_selector('section > div._3KXtu._3jY37 > a').text_content()
获取属性: .get_attribute()
# ul->li下
 link = element.query_selector('h5 a').get_attribute('href')

wait_for_load_state

"commit ": 接收到网络响应且文档开始加载时(仅显示了页面默认窗口视图下的元素)
"domcontentloaded": 认为在 DOMContentLoaded 事件完成时(显示了完整页面)
"load": 在 load 事件完成时操作完成(含了所有图片资源)
"networkidle": 至少 500 毫秒内没有网络连接时操作完成

页面加载的整个状态变化
Commit -> DOMContentLoaded -> load -> networkidle

监听 response 事件:page.on()

from playwright.sync_api import sync_playwright
 
def on_response(response):
    if '/api/movie/' in response.url and response.status == 200:
        print(response.json())
        print(f'Statue {response.status}:{response.url}')
 
with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    # Page 就是单独的一个浏览器 tab 标签
    page = browser.new_page()
    page.on('response', on_response)
    # page.on('response', lambda response: on_response(response, product_data, id))
    page.goto('https://spa6.scrape.center/')
    page.wait_for_load_state('networkidle')
    browser.close()

# 监听弹窗
with page.expect_popup() as popup:
	page.evaluate('window.open()')
popup.value.goto('http://www.baidu.com')
# 监听请求
with page.expect_request('**/*login*.png') as first:
	page.goto('http://www.baidu.com')
print(first.value.url)

传参监听

 page.on('response', lambda response: on_response(response, id))
 for (url, id) in urls:
 	pass

滚动

下拉滚动条
page.evaluate("var q=document.documentElement.scrollTop=15000")
鼠标滚动
page.mouse.wheel(0,7000)

截图

 with sync_playwright() as p:
        browser = p.chromium.launch(headless=False, slow_mo=50)
        page = browser.new_page()
        page.goto("http://www.baidu.com")
        page.screenshot(path="example.png")
        browser.close()

获取cookie

browser = playwright.chromium.launch(headless=False)
context = browser.new_context()

cookies = context.storage_state()
cookie = '; '.join([f'{key["name"]}={key["value"]}' for key in cookies['cookies']])

CSS,xpath选择器

t伪类选择器
has-text():检测包含(返回找到的所有元素)
text():检测等于(返回第一个找到的元素)

# 选择文本是 Log in 的节点,并点击
page.click("text=Log in",timeout=5000)
page.click("text=你好,请登录")

page.locator(':has-text("All products")').click() 

page.locator("#nav-bar :text('Contact us')").click()
page.locator('[data-test=login-button]').click()
page.locator("[aria-label='Sign in']").click()

# 选择 id 为 nav-bar 子孙节点 class 属性值为 contact-us-item,并点击
page.click("#nav-bar .contact-us-item")
 
# 选择文本中包含 Playwright 的 article 节点
page.click("article:has-text('Playwright')")
 
# 选择 id 为 nav-bar 节点中文本值等于 Contact us 的节点
page.click("#nav-bar :text('Contact us')")
 
# 选择 class 为 item-description 的节点,且该节点还要包含 class 为 item-promo-banner 的子节点
page.click(".item-description:has(.item-promo-banner)")
 
# 择的就是一个 input 节点,并且该 input 节点要位于文本值为 Username 的节点的右侧
page.click("input:right-of(:text('Username'))")

# xpath
page.click("xpath=//button")

get_by_xxx定位器

●page.get_by_text(文本,**kwargs)按文本内容定位。
●page.get_by_role(角色,**kwargs)按角色属性

●page.get_by_label(文本,**kwargs)通过关联标签的文本查找表单控件
● page.get_by_test_id(test_id)根据元素的属性定位元素(可以配置其他属性)
page.get_by_placeholder(文本,**kwargs)按占位符查找输入

● 通过其文本替代来定位元素,通常是图像。
●page.get_by_title(文本,**kwargs)按标题定位元素。

page.get_by_label("Password").fill("secret-password")

page.get_by_role("option", name="全部企业").click()
page.get_by_role("button", name="Sign in").click()

# 关闭详情弹窗
page.frame_locator("internal:attr=[title=\"详情页\"i]").locator(
                "#enterprise-details-close").click()

# 文本内容
page.get_by_text(str(select_text)).click()

# 正则匹配定位
page.get_by_role("tab", name=re.compile("风险信息", re.IGNORECASE)).click()

Playwright 入门详细教程

循环遍历ul: query_selector_all()

uls = page.query_selector_all('//*[@id="YZhV9-anchor"]//table[@class="ant-table-fixed"]/tbody/tr')
for ele_items in uls:
	title = ele_items.query_selector('section > div._3KXtu._3jY37 > a').text_content()

同级第几个:.nth(2)

点击最后一个按钮
page.click("button >> nth=-1")

page.get_by_placeholder("请输入手机号码").nth(1).click()

文本输入:.fill()

# 标签定位输入
page.locator('text=First Name').fill('Peter')

page.get_by_placeholder("请输入手机号码").nth(1).fill('12345678901')

定位器过滤器:filter

page.locator("a").filter(has_text="密码登录").click()

刷新,前进,后退

page.reload(**kwargs) # 刷新
page.go_back(**kwargs)  # 后退
page.go_forward(**kwargs)  # 前进

等待

# 等待直到title元素被加载完全
page.locator("title").wait_for()   

# 会自动等待按钮加载好再执行点击
page.locator("button", has_text="sign up").click() 

# Playwright 会等待 #search 元素出现在 DOM 中
page.fill('#search', 'query')

# Playwright 会等待元素停止动画并接受点击
page.click('#search')

# 等待 #search 出现在 DOM 中
page.wait_for_selector('#search', state='attached')
# 等待 #promo 可见, 例如具有 `visibility:visible` 
page.wait_for_selector('#promo')

# 等待 #details 变得不可见, 例如通过 `display:none`.
page.wait_for_selector('#details', state='hidden')

# 等待 #promo 从 DOM 中移除
page.wait_for_selector('#promo', state='detached')


# 随机等待
page.wait_for_timeout(random.uniform(2500, 4500))

点击

  • 左键点击:page.click(“id=su”)
  • 点击元素左上角:page.click(‘id=su’, position={‘x’: 0, ‘y’: 0})
  • Shift + click:page.click(“id=su”, modifiers=[‘Shift’])
  • 强制点击:page.click(“id=su”, force=True)
  • 右键点击:page.click(“id=su”, button=‘right’)
  • 双击:page.dblclick(“id=su”)
  • 悬停在元素上:page.hover(‘id=su’)

模拟键盘输入

page.press("id=kw", 'Control+A'):Control+A
page.press('id=kw', 'Enter'):点击回车

# 一个字符一个字符的输入
page.type("id=kw", "playwright", delay=100): 每个字符延迟100ms输入

参考:
https://huaweicloud.csdn.net/63802f5edacf622b8df864ec.html#devmenu22
https://blog.csdn.net/u010698107/article/details/121070336文章来源地址https://www.toymoban.com/news/detail-413332.html

到了这里,关于Playwright 入门详细教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • playwright基础教程

    Playwright是一个由Microsoft开发的自动化测试工具,可以用来测试Web应用程序。它支持多种编程语言和多个浏览器,包括Chrome,Firefox和WebKit。它通过提供一组API,使得开发人员可以在浏览器中模拟用户行为,例如单击,输入文本和导航到不同的页面,同时还能捕捉截图和视频。

    2024年02月09日
    浏览(58)
  • playwright教程 (一)适合小白

    playwright是微软发布的一款自动化测试工具,可以自动生成代码 在学习playwright前可以了解playwright文档,目前只有英文版!

    2024年02月10日
    浏览(27)
  • 【playwright】新一代自动化测试神器playwright+python系列课程12_playwright_frame中元素定位

    网页中经常嵌套frame框架,在网页中标签为iframe或frame的元素就是frame框架 如图 或者 在frame框架中的元素时不能直接定位的,selenium处理frame,需要切换到frame中,然后再切换出来,操作比较麻烦,那么playwright对于frame的操作会不会更加简单呢? 答案是肯定的,playwright不需要切

    2024年01月18日
    浏览(28)
  • 【playwright】新一代自动化测试神器playwright+python系列课程22_playwright模拟鼠标操作_悬停_右击_双击

    有些元素,只有你鼠标移动到它那个位置上,他才会展开或者显示一些内容,这时候就要用到hover()操作了。 以个人设置这个下拉菜单,来看一下hover的使用。 项目实践代码 以双击关闭弹出的流程窗口为例,看一下dblclick()使用 项目实践代码 以弹出的右键菜单为例,看一下

    2024年01月18日
    浏览(28)
  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-3-离线搭建playwright环境

    有些小伙伴或者童鞋们私信留言说自己是在公司局域网办公,或者公司为了安全对网络管控比较严格(尤其是一些大的国企、央企),总之就是一句话无法连到外网去在线下载,宏哥刚看到留言时觉得这问题还留言问啊,你找个有网的电脑下载好安装包然后安装就可以用了。

    2024年02月08日
    浏览(58)
  • Playwright for Python:断言

    Playwright支持以下几种断言: 断言 描述 expect(locator).to_be_checked() 复选框被选中 expect(locator).to_be_disabled() 元素是禁用状态 expect(locator).to_be_editable() 元素是可编辑状态 expect(locator).to_be_empty() 容器是空的 expect(locator).to_be_enabled() 元素是可用的 expect(locator).to_be_focused() 元素已获取焦

    2024年02月09日
    浏览(29)
  • python安装playwright问题记录

    python安装playwright这个时候,有得时候会https timeout 有的时候会 not found。 我最后使用的方法三,挺好用的。 PyPI · The Python Package Index 可以尝试使用的方法 1. 更换pip源:使用国内的pip源可以提高下载速度并减少超时问题。例如,你可以将pip源更改为清华大学的镜像源,使用以下

    2024年02月10日
    浏览(36)
  • 【python playwright 安装及验证】

    pip install playwright pip install playwright -i https://pypi.tuna.tsinghua.edu.cn/simple playwright codegen -o script.py -b chromium --ignore-https-errors --viewport-size “2560,1440” --proxy-server “http://100.8.64.8:60497” https://www.baidu.com/

    2024年02月01日
    浏览(22)
  • Playwright 结合 Selenium Grid - 1.windows 环境使用教程

    Playwright 可以连接到运行 Selenium 4 的 Selenium Grid Hub 来启动 Google Chrome 或 Microsoft Edge 浏览器,而不是在本地机器上运行浏览器。 打开selenium官方https://www.selenium.dev/downloads/下载Selenium Server (Grid) 目前最新版本4.16.1 下载地址https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.16.0

    2024年01月22日
    浏览(27)
  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-2-playwright的API及其他知识

    上一篇宏哥已经将Python+Playwright的环境搭建好了,而且也简单的演示了一下三款浏览器的启动和关闭,是不是很简单啊。今天主要是把一篇的中的代码进行一次详细的注释,然后说一下playwright的API和其他相关知识点。那么首先将上一篇中的代码进行一下详细的解释。 2.1创建浏

    2024年02月07日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包