Python-playwright 初步使用

说明:playwright可以用于UI自动化测试,有方便的录制插件,录制出来的脚本准确度也比较高,也比较方便调试修改。下面以直接使用者的角度介绍下playwright如何快速上手使用

一、基于python环境安装playwright

说明:安装playwright插件,注意要先安装python环境

pip install playwright

二、下载浏览器内核驱动

说明:下载浏览器内核,录制程序使用

playwright install

三、启动录制

playwright codegen https://baidu.con

四、流程说明

说明:直接把录制生成的代码复制到python编辑器里面就能运行,下面我们说明下各代码含义

再调试下录制生成的代码,确保每个元素能正常获取到,特别是部分元素是通过id获取的,这种就需要手动修改脚本


1.生成浏览器驱动

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

说明:可支持的浏览器有'chromium', 'webkit' or 'firefox',方法里面的参数支持设置是否是无头模式、窗口大小、是否代理等等

2.生成浏览器上下文(context)对象

context = browser.new_context(no_viewport=True)

说明:创建context对象,context之间是相互隔离的,可以理解为轻量级的浏览器实例.如需要不同用户登录同一个网页,不需要创建多个浏览器实例,只需要创建多个context即可。

3.生成浏览器页面page

page = context.new_page()

说明:page就相当于浏览器的选项卡,一般在浏览器context上创建,后续打开网页 、定位元素、页面操作都是基于page

4.打开一个指定url地址

page.goto("https://www.baidu.com")

五、相关操作方法说明

1.常用基本方法

查找元素

page.locator():元素定位器

page.get_by_text("文本内容"):查找文本匹配的元素

page.get_by_role("button"):get_by_role是一个查找页面元素的方法,代表要查找的元素的角色或类型

模拟点击相关

# 点击

page.get_by_role("button").click()

# 双击

page.get_by_text("Item").dblclick()

# 右击

page.get_by_text("Item").click(button="right")

# Shift + 点击

page.get_by_text("Item").click(modifiers=["Shift"])

# 鼠标悬停在元素上

page.get_by_text("Item").hover()

# 点击左上角

page.get_by_text("Item").click(position={ "x": 0, "y": 0})

模拟输入

fill():输入文字

type():一个字符一个字符地输入字段,就好像它是一个使用locator.type()的真实键盘的用户。


获取元素文本

inner_text():获取元素的文本内容


等待时间

page.wait_for_timeout(2000):强制等待2秒


检查元素是否找到

disable_button is not None   找到标识true,未找到为false


模拟键盘按钮

# 按Enter键

page.get_by_text("Submit").press("Enter")

# 在键盘上按$符号

page.get_by_role("textbox").press("$")


文件上传

page.set_input_files("input[type=file]", r'E:\基础内容\POC环境相关文档\合同文档合集\信托合同.pdf')


2.汇总

page.locator():playwright的核心功能之一,元素定位器

query_selector():返回第一个匹配给定CSS选择器的元素。如果找不到匹配的元素,则返回None。

query_selector_all():用于在页面中查询匹配指定CSS选择器的所有元素,如果没有找到匹配的元素,则返回空列表。

page.get_by_text()通过文本内容定位。

page.get_by_label()通过关联标签的文本定位表单控件。

page.get_by_placeholder()按占位符定位。

page.get_by_title()通过标题属性定位元素。

page.get_by_role()通过显式和隐式可访问性属性进行定位。

page.get_by_alt_text()通过替代文本定位元素,通常是图像。

page.get_by_test_id()根据data-testid属性定位元素(可以配置其他属性)。

has_text()查找子代或后代所有包含对应文本的,相反的也有has_not_text()

inner_text():获取元素的文本内容

click():点击事件

fill("XXX"):写入内容

first.click():第一个元素

nth(1).click():下标为1的元素,从0开始

page.set_input_files("input[type=file]", r'E:\基础内容\POC环境相关文档\合同文档合集\信托合同.pdf'):文件上传

reload():用于重新加载当前页面。这个方法会发送一个浏览器级别的“页面刷新”请求,清除并重新加载整个页面的内容。


六、详细说明

1.launch

launch()方法是Playwright库中用于启动浏览器的函数。它接受一个可选参数,该参数可以是一个字典,用于配置浏览器的选项。

下面是一些常用的launch()方法的选项:

headless: 布尔值,默认为True。如果设置为False,则会在启动浏览器时显示浏览器窗口。

slow_mo: 浮点数,默认为0。如果设置为大于0的值,则会增加浏览器操作的延迟时间(单位为毫秒)。

ignore_https_errors: 布尔值,默认为False。如果设置为True,则在访问HTTPS网站时不会检查证书错误。

viewport: 字典,用于指定浏览器窗口的大小和位置。例如:{'width': 800, 'height': 600}。

args: 列表,用于传递给浏览器进程的命令行参数。例如:['--disable-gpu']。

2.new_context

new_context()方法是Playwright库中用于创建一个新的浏览器上下文的函数。它接受一个可选参数,该参数可以是一个字典,用于配置浏览器上下文的选项。下面是一些常用的new_context()方法的选项:

user_agent: 字符串,默认为当前浏览器的用户代理字符串。如果设置为其他值,则会使用指定的用户代理字符串。

viewport: 字典,用于指定浏览器窗口的大小和位置。例如:{'width': 800, 'height': 600}。

accept_downloads: 布尔值,默认为False。如果设置为True,则会在下载文件时自动接受下载对话框。

record_har: 字典,用于录制HTTP请求和响应数据。例如:{'path': '/tmp/har.har'}。

3.new_page

new_page()方法是Playwright库中用于创建新的浏览器页面的函数。下面是一些常用的new_page()方法的用法:

browser.new_page()创建一个新的浏览器页面

page.goto('https://www.baidu.com')打开一个网页

page.url获取当前页面的URL

page.evaluate('() => document.title')在页面上执行JavaScript代码

page.screenshot(path='screenshot.png')截取页面的屏幕截图

4.locator

locator()方法可以根据元素的CSS选择器来查找。您可以使用各种CSS选择器,包括但不限于:

标签名:例如 page.locator('button')

类名:例如 page.locator('.my-class')

ID:例如 page.locator('#my-id')

属性:例如 page.locator('[data-testid="my-test-id"]')

文本内容:例如 page.locator(':text("My Text")')


locator()方法支持所有的CSS选择器,包括:

基本选择器:例如div, span, .my-class, #my-id等。

属性选择器:例如[href], [class="my-class"], [data-my-attr="value"]等。

伪类选择器:例如:hover, :focus, :first-child, :last-of-type等。

结合选择器:例如div.my-class, div, span, div > p, div + p等。


文本选择器

page.click('text=登录'):没有加引号(单引号或者双引号),模糊匹配,对大小写不敏感

page.click('text="登录"'):有引号,精确匹配,对大小写敏感

比如:<article><div >Playwright</div></article>

page.locator(':has_text("Playwright")').click()

# 也可以这样写,指定标签

page.locator('article:has_text("Playwright")').click()

# 也可以这样

page.locator(":text('Playwright')").click()

# 还可以这样

page.locator('article:has'text=Playwright').click()


css选择器

page.locator('button').click() # 根据标签

page.locator('#nav-bar .contact-us-item').click() # 通过id +class

page.locator('[data-test=login-button]').click() # 属性定位

page.locator("[aria-label='Sign in']").click()

#css定位前面可以加个css=,但是不加也可以程序也会自动匹配


Xpath 定位

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


组合定位:text、css、xpath三者可以两组合定位

page.locator("article:has-text('Playwright')").click()

page.locator("#nav-bar :text('Contact us')").click()

css+css组合定位

page.locator(".item-description:has(.item-promo-banner)").click()

Xpath + css 组合定位

page.fill('//div[@class="SignFlow-account"] >>css=[name="username"]',"0863")

xpath+xpath组合定位

page.fill('//div[@class="SignFlowInput"] >> //input[@name="password"]',"ma160065")

5. get_by

get_by_id: 通过元素的 id 属性来查找元素,例如:page.get_by_id("my-id")

get_by_name: 通过元素的 name 属性来查找元素,例如:page.get_by_name("my-name")

get_by_text: 通过元素的文本内容来查找元素,例如:page.get_by_text("Submit")

get_by_title: 通过元素的 title 属性来查找元素,例如:page.get_by_title("my-title")

get_by_placeholder: 通过元素的 placeholder 属性来查找元素,例如:page.get_by_placeholder("my-placeholder")

get_by_selector: 通过 CSS 选择器来查找元素,例如:page.get_by_selector("#submit-button")

get_by_xpath: 通过 XPath 表达式来查找元素,例如:page.get_by_xpath("//div[@class='my-class']")

get_by_label: 根据label属性值查找元素,类似于HTML中的label标签和对应的for属性。

get_by_role: 通过角色方式定位元素,例如:page.get_by_role("button", name="Submit")


6.get_by_role

元素:<li class="el-menu-item" role="menuitem" tabindex="-1">队列管理</li>

page.get_by_role("menuitem", name="队列管理").click()

元素:<button class="el-button el-button--primary el-button--default mr-24px mb-12px" aria-disabled="false" type="button"><span>新增队列</span></button>

page.get_by_role("button", name="新增队列").click()


7.set_input_files

# 上传文件

# 选择单个文件

page.set_input_files("input[type=file]", r'E:\基础内容\POC环境相关文档\合同文档合集\信托合同.pdf')

page.get_by_label("Upload file").set_input_files('myfile.pdf')

# 选择多个文件

page.get_by_label("Upload files").set_input_files(['file1.txt', 'file2.txt'])

# 删除所有选中文件

page.get_by_label("Upload file").set_input_files([])

# 从内存中上传缓冲区

page.get_by_label("Upload file").set_input_files(

    files=[

        {"name": "test.txt", "mimeType": "text/plain", "buffer": b"this is a test"}

    ],

)

# 处理动态页面上的焦点事件

page.get_by_label('password').focus()

# 拖拽元素

page.locator("#item-to-be-dragged").drag_to(page.locator("#item-to-drop-at"))

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容