首页 > 编程语言 >python+playwright 学习-73 page.wait_for_selector()

python+playwright 学习-73 page.wait_for_selector()

时间:2023-08-19 17:33:46浏览次数:37  
标签:playwright DOM python 元素 selector state page wait

前言

网页上的元素有不同状态,有些元素本来不在DOM里,点击某个按钮后才出现。
有些元素是本来就已经在DOM里是隐藏的状态,点某个按钮后才变成显示状态。
如果我们想让元素到达指定的状态再下一步操作,可以用page.wait_for_selector() 方法。

page.wait_for_selector() 方法

wait_for_selector() 方法部分源码

    def wait_for_selector(
        self,
        selector: str,
        *,
        timeout: typing.Optional[float] = None,
        state: typing.Optional[
            Literal["attached", "detached", "hidden", "visible"]
        ] = None,
        strict: typing.Optional[bool] = None
    ) -> typing.Optional["ElementHandle"]:

state 参数可以设置等待状态,用四个状态:"attached", "detached", "hidden", "visible"。

1.等待元素出现在DOM中

page.wait_for_selector("定位方法", state='attached')

2.等待从DOM中移除

page.wait_for_selector("定位方法", state='detached')

3.等待元素可见

page.wait_for_selector("定位方法", state="visible")

4.等待元素不可见

page.wait_for_selector("定位方法", state='hidden')

如果没有传 state 参数,默认情况下是等待元素可见 visible

page.wait_for_selector("定位方法")

等待元素出现在DOM

如下提示框,默认情况下DOM里面是没有这个元素的

只有触发了某个操作,它才会动态的加载到DOM里

等待元素出现在dom

from playwright.sync_api import sync_playwright, expect


with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()
    page.goto('file:///C:/Users/dell/Desktop/a2/t.html')

    # 点击success按钮
    page.locator('.btn-success').click()

    # 等待元素出现在dom
    loc_msg = page.wait_for_selector('.toast-message', state="attached")
    # 获取元素文本
    print(loc_msg.inner_text())
    page.wait_for_selector('.toast-message', state="detached")
    print("元素已经从DOM移除")

如果等不到对应的元素状态,默认30秒会报超时异常。也可以自己设置timeout时间

如下设置,判断元素5秒内从DOM中移除

page.wait_for_selector('.toast-message', state="detached", timeout=5000)

等待元素显示和隐藏

元素本身就在DOM里,只是状态发生改变:隐藏和显示

如下提示语本来就在DOM里,只是默认是隐藏状态

当触发了某个操作,它变成显示状态

除了这种文本的状态显示,还有一些弹出操作框也一样, 如下弹出框,默认情况下是隐藏了,点按钮后会弹出来。

这种可以用等待元素可见与不可见操作
等待元素可见

page.wait_for_selector("定位方法", state="visible")

等待元素不可见(隐藏状态)

page.wait_for_selector("定位方法", state='hidden')

wait_for() 方法

另外一个先定位元素,再使用wait_for() 方法也可以等待元素到达指定的状态。

page.locator('.toast-message').wait_for(state="attached")
print(page.locator('.toast-message').inner_text())
page.locator('.toast-message').wait_for(state="detached")
print("元素已经从DOM移除")

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

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

标签:playwright,DOM,python,元素,selector,state,page,wait
From: https://www.cnblogs.com/yoyoketang/p/17642763.html

相关文章

  • python
    pythondeffibonacci_sequence(n):  sequence=[0,1]  foriinrange(2,n):    next_number=sequence[i-1]+sequence[i-2]    sequence.append(next_number)  returnsequence#示例输入n=10#调用函数并打印结果print("斐波那契数列前",n,"......
  • python
    pythondeffibonacci_sequence(n):  sequence=[0,1]  foriinrange(2,n):    next_number=sequence[i-1]+sequence[i-2]    sequence.append(next_number)  returnsequence#示例输入n=10#调用函数并打印结果print("斐波那契数列前",n,"......
  • python模拟用户pa取
    使用Selenium模拟用户爬取页面内容,并输出成文件。关于Selenium是什么,欢迎看这篇文章:seleniumPython教程。在这里,我只讲我主要的实现。首先作为一款工具脚本,我们应该不喜欢窗口界面吧,除非你需要动态的观察程序的操作。所以,我开启了无头浏览器模式#无头浏览器chrome_options=webd......
  • python ORM框架
    导入需要的模块和函数这里的faker是为了后期的模拟数据使用,这里先透露一下。剩下的导入都和sqlalchemy的函数或包有关,如字段的类型、session的管理器、sql建表语句的生成等。fromsqlalchemyimportcreate_engine,Column,Integer,String,DateTimefromsqlalchemy.ext.declara......
  • python生成模拟数据
    python faker的使用Faker是一个Python包,开源的GITHUB项目,主要用来创建伪数据,使用Faker包,无需再手动生成或者手写随机数来生成数据,只需要调用Faker提供的方法,即可完成数据的生成安装pipinstallFaker使用fromfakerimportFakerfaker=Faker(locale='zh_CN')fromfakerimportF......
  • Python足球小游戏代码
    基于Python pygame的足球游戏源代码,游戏可以双人玩,游戏入口程序为soccer.py。控制人物一方向键:wasd,射门键:r控制人物二,方向键:键盘方向键,射门键:k程序运行截图核心程序代码:soccer.py#-*-coding:utf-8-*-from__future__importunicode_literalsimportitertools,sys,ti......
  • python实现发送udp数据包数据
    需求:python发送udp数据包数据,支持host、port、valueFile等启动参数,其中valueFile是json格式的文件,要解析编码完成转换。分模块实现:发送端:导入所需的模块和类,例如sys、logging、argparse、json、socket以及datetime和timedelta。定义一个Sender类,变量MULTI_TABLE_HEADER和SINGL......
  • Python - 引用 内存地址 地址传递 值传递
    内存地址是数据在物理内存中的存储位置;Java常量池驻留,int是-5~256  __new__方法用于定义创建对象时执行的操作,__new__方法仅仅为用户提供一个创建对象时干预的入口,真正执行创建对象的操作由object类中的__new__方法完成。del操作的实质是断开变量与内存数据之间的引用,操......
  • Python练习:输入一个整数,输出该数二进制表示中1的个数。
      Python3整数对象存储为无符号数加上符号位标志,所以不存在“负数”补码形式,因此,计算“1”的数量需要按去符号后的无符号数:cnt=bin(n).count('1')另外,Python3无长整,整数长度原则上不限,所以不能以假定的32位处理。    补码+原码=2**321#-*-coding:ut......
  • centos安装python3.7
    1.安装openssl11https://www.cnblogs.com/navysummer/p/17642466.html2.安装依赖yuminstallzlib-develbzip2-develncurses-develsqlite-develreadline-develtk-develgccmakelibffi-devel-y 3.安装python3.7 wgethttps://www.python.org/ftp/python/3.7.17/Pyt......