PlayWright -元素节点操作

元素操作

获取元素信息

locator.inner_html()  #获取某个元素的HTML
locator.text_content() #用来获取某个元素内所有文本内容,包含子元素内容,隐藏元素也能获取。返回值不会被格式化,返回值依赖于代码的内容
locator.inner_text()    #的返回值会被格式化,inner_text()返回的值, 依赖于页面的显示, 
locator.count()  #获取元素个数
all_inner_texts() 和 all_text_contents()  #也是用于获取页面上的文本,但是返回的是list列表

输入

  • locator.fill() 是填写表单字段的最简单方法。它聚焦元素并input使用输入的文本触发事件。它适用于<input>,<textarea>[contenteditable]元素。这可能会导致意外行为。
  • Type 输入:一个字符一个字符地输入字段,就好像它是一个使用locator.type()的真实键盘的用户。此方法将发出所有必要的键盘事件,所有keydown, keyup,keypress事件就位。您甚至可以指定delay按键之间的可选操作来模拟真实的用户行为。 大多数时候,page.fill()会正常工作
# Text 文本框输入
page.get_by_role("textbox").fill("Peter")

# 根据label 定位 Date 日期输入
page.get_by_label("Birth date").fill("2020-02-02")

# Time input
page.get_by_label("Appointment time").fill("13:15")

# Local datetime input
page.get_by_label("Local time").fill("2020-03-02T05:15")


page.locator('#area').type('Hello World!')

点击元素


# 定位可见元素
page.click("button:visible")
page.click("button >> visible=true")


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

# Double click
page.get_by_text("Item").dblclick()

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

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

# Hover over element
page.get_by_text("Item").hover()

# Click the top left corner
page.get_by_text("Item").click(position={ "x": 0, "y": 0})

在幕后,这个和其他与指针相关的方法:

  • 等待具有给定选择器的元素出现在 DOM 中 (不用自己去写轮询等待了
  • 等待它显示出来,即不为空,不display:none,不visibility:hidden (这个太人性化了,不用去判断元素是否隐藏
  • 等待它停止移动,例如,直到 css 转换完成
  • 将元素滚动到视图中 (这个太人性化了,不用自己去滚动了
  • 等待它在动作点接收指针事件,例如,等待直到元素变得不被其他元素遮挡
  • 如果元素在上述任何检查期间分离,则重试

由此可见,click() 方法优化了selenium 点击元素的遇到的一些痛点问题,比如元素遮挡,不在当前屏幕,元素未出现在DOM中或隐藏不可见等不可点击的状态。

聚焦高亮

locator对象.focus() #聚焦
locator对象.highlight()  #高亮

drag_to元素拖动

您可以使用locator.drag_to()执行拖放操作。此方法将:

  • 将鼠标悬停在要拖动的元素上。
  • 按鼠标左键。
  • 将鼠标移动到将接收放置的元素。
  • 松开鼠标左键。
#先定位元素,调用drag_to方法到目标元素
page.locator("#item-to-be-dragged").drag_to(page.locator("#item-to-drop-at"))

#page对象直接调用
page.drag_and_drop(source: str,  target: str)

如果您想精确控制拖动操作,请使用较低级别的方法,如locator.hover()mouse.down()mouse.move()mouse.up()

page.locator("#item-to-be-dragged").hover()
page.mouse.down()
page.locator("#item-to-drop-at").hover()
page.mouse.up()

如果您的页面依赖于dragover正在调度的事件,则您至少需要移动两次鼠标才能在所有浏览器中触发它。要可靠地发出第二次鼠标移动,请重复mouse.move()或locator.hover()两次。操作顺序是:悬停拖动元素,鼠标向下,悬停放置元素,第二次悬停放置元素,鼠标向上。

元素可视区域

playwright 在操作元素的时候,都会自动去让元素出现在可视窗口。大部分情况不需要我们去操作滚动条。

from playwright.sync_api import sync_playwright


with sync_playwright() as pw:
	browser = pw.chromium.launch(headless=False, slow_mo=2000)
	page = browser.new_page()
	
	page.goto("https://www.runoob.com/")
	
	# 滚动元素到屏幕可视窗口
	page.get_by_text('【学习 Django】').scroll_into_view_if_needed()

hover 方法是把鼠标放到元素上,它也会自动去页面上找到元素,让它出现在可视窗口

from playwright.sync_api import sync_playwright


with sync_playwright() as pw:
	browser = pw.chromium.launch(headless=False, slow_mo=2000)
	page = browser.new_page()
	
	page.goto("https://www.runoob.com/")
	
	# 鼠标放到元素上
	page.get_by_text('【学习 Django】').hover()

遍历节点

定位第N个元素

locator可以定位一个或多个元素

a1 = page.locator('[type="checkbox"]')
page.locator().all()
a1.count()   #返回元素个数.用于判断元素是否存在
a1.first.click()  # 点第一个
a1.last.click()   # 点最后个
a1.nth(0).click()  #按照索引

有时页面包含许多相似的元素,很难选择一个特定的元素。例如:

<section>
	<button>Buy</button> 
</section>
<article><div> 
	<button>Buy</button>
</div></article>
<div><div>
	<button>Buy</button> 
</div></div>

我们可以使用:nth-match(:text(“Buy”), 3)从上面的HTML中选择第三个按钮。

# 点击第三个按钮 Bug
page.locator(":nth-match(:text('Buy'), 3)").click()

等待元素

强制等待

Playwright 在查找元素的时候具有自动等待功能

请使用 page.wait_for_timeout(5000) 代替 time.sleep(5)并且最好不要等待超时。这是因为我们内部依赖于异步操作,并且在使用时time.sleep(5)无法正确处理它们。

page.pause()断点

playwright 的page.pause() 断点功能出现,让打开可以愉快的在页面上调试了,我们甚至可以直接使用 playwright.$(selector) 直接支持playwright选择器的方法。

在代码中加入page.pause()进入断点状态,运行后会弹出 playwright inspector 工具

判断页面元素状态

判断元素是否存在

   # 元素存在
    loc1 = page.locator("id=kw")
    print(loc1)
    print(loc1.count())

    # 元素不存在
    loc2 = page.locator('id=yoyo')
    print(loc2)
    print(loc2.count())
  • page对象调用的判断方法, 传一个selector 定位参数
    • page.is_checked(selector: str) # checkbox or radio 是否选中
    • page.is_disabled(selector: str) # 元素是否可以点击或编辑
    • page.is_editable(selector: str) # 元素是否可以编辑
    • page.is_enabled(selector: str)# 是否可以操作
    • page.is_hidden(selector: str)# 是否隐藏
    • page.is_visible(selector: str) # 是否可见
  • locator 对象调用的判断方法示例locator.is_visible()
  • 元素句柄可调用的判断方法示例element_handle.is_visible()

元素句柄(element_handle)是通过page.query_selector()方法调用返回的ElementHandle ,这种一般不常用.
关于元素句柄和locator 定位的区别

wait_for_selector()

wait_for() 方法 和 wait_for_selector()使用区别:

  • page.locator(‘定位元素’).wait_for() 返回的是None,后面不能继续操作元素
  • page.wait_for_selector(“定位方法”) 返回的是locator 对象,后面可以继续操作元素

在延迟加载的页面中,使用locator.wait_for()等待元素可见是很有用的。

# Navigate and wait for element
page.goto("https://example.com")
page.get_by_text("example domain").wait_for()

  • wait_for_selector()
    • timeout:超时时间
    • state 参数可以设置等待状态:”attached”, “detached”, “hidden”, “visible”。
# click/fill这样的页面交互会自动等待元素。
page.goto("https://example.com")
page.get_by_text("example domain").click()

#等待元素可见
page.wait_for_selector("定位方法", state="visible")
page.wait_for_selector("定位方法") #默认是等待元素可见

#等待元素出现在DOM中
page.wait_for_selector("定位方法", state='attached')
#等待从DOM中移除
page.wait_for_selector("定位方法", state='detached')
#等待元素不可见
page.wait_for_selector("定位方法", state='hidden')


关于我

个人博客:https://halo.wenke.fun

  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Playwright是一个用于自动化浏览器操作的工具,它可以录制和回放用户在浏览器中的操作。下面是使用Playwright录制操作的步骤: 1. 安装Playwright:首先,你需要在你的项目中安装Playwright库。你可以使用以下命令来安装Playwright: ``` npm install playwright ``` 2. 创建一个新的Playwright实例:在你的代码中,你需要创建一个新的Playwright实例。你可以使用以下代码来创建一个Chromium浏览器实例: ```javascript const { chromium } = require('playwright'); (async () => { const browser = await chromium.launch(); const context = await browser.newContext(); const page = await context.newPage(); // 在这里进行录制操作 await browser.close(); })(); ``` 3. 录制操作:在创建了浏览器实例后,你可以开始录制你的操作了。你可以使用Playwright提供的方法来模拟用户在浏览器中的操作,例如点击、输入文本等。以下是一些常用的操作示例: - 点击元素: ```javascript await page.click('button'); ``` - 输入文本: ```javascript await page.fill('input', 'Hello World'); ``` - 导航到URL: ```javascript await page.goto('https://www.example.com'); ``` 4. 保存录制结果:在录制完成后,你可以将录制结果保存为一个脚本文件,以便以后回放。你可以使用以下代码将录制结果保存为一个脚本文件: ```javascript const fs = require('fs'); const script = ` // 在这里插入录制的操作步骤 `; fs.writeFileSync('script.js', script); ``` 这样,你就可以使用Playwright录制和回放浏览器操作了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值