我在一个网页上有一个按钮,它看起来像这样:

<button rpl="" aria-controls="comment-children" aria-expanded="true" aria-label="Toggle Comment Thread" class="text-neutral-content-strong bg-neutral-background overflow-visible w-md h-md
button-small px-[var(--rem6)]
button-plain


icon
items-center justify-center
button inline-flex "> <!--?lit$747127195$--><!----><span class="flex items-center justify-center"> <!--?lit$747127195$--><span class="flex"><!--?lit$747127195$--><svg rpl="" fill="currentColor" height="16" icon-name="leave-outline" viewBox="0 0 20 20" width="16" xmlns="http://www.w3.org/2000/svg"> <!--?lit$747127195$--><!--?lit$747127195$--><path d="M14 10.625H6v-1.25h8v1.25ZM20 10a10 10 0 1 0-10 10 10.011 10.011 0 0 0 10-10Zm-1.25 0A8.75 8.75 0 1 1 10 1.25 8.76 8.76 0 0 1 18.75 10Z"></path><!--?--> </svg></span> <!--?lit$747127195$--> </span> <!--?lit$747127195$--><!--?--><!----><!----><!----> </button>

我想用Playwright在我的Python代码中按下它.我写道:

page.locator('button[aria-label="Toggle Comment Thread"]').first().click()

可惜的是,它给了我TypeError: 'Locator' object is not callable个错误.当我不使用first()时,它说

Error: Error: strict mode violation: locator("button[aria-label=\"Toggle Comment Thread\"]") resolved to 3 elements:

这是正确的,页面上有三个按钮.我只想点击第一个.

推荐答案

try .first次而不是.first()次:

page.locator('button[aria-label="Toggle Comment Thread"]').first.click()

可运行的示例:

from playwright.sync_api import sync_playwright # 1.40.0

html = '<button aria-label="Toggle Comment Thread"></button>'

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()
    page.set_content(html)
    page.locator('button[aria-label="Toggle Comment Thread"]').first.click()
    browser.close()

也就是说,最好是get_by_role:

page.get_by_role("button", name="Toggle Comment Thread").first.click()

并尽量避免.first;找到一种更严格的方法来唯一标识元素(可能使用元素的其他许多属性之一),而不是依赖于页面上的元素排序,因为页面上的元素排序很容易意外更改.

Python相关问答推荐

由于NEP 50,向uint 8添加-256的代码是否会在numpy 2中失败?

使用miniconda创建环境的问题

为什么sys.exit()不能与subproccess.run()或subprocess.call()一起使用

如何将Docker内部运行的mariadb与主机上Docker外部运行的Python脚本连接起来

Godot:需要碰撞的对象的AdditionerBody2D或Area2D以及queue_free?

将tdqm与cx.Oracle查询集成

在ubuntu上安装dlib时出错

根据列值添加时区

如何在turtle中不使用write()来绘制填充字母(例如OEG)

通过ManyToMany字段与Through在Django Admin中过滤

在输入行运行时停止代码

如何根据rame中的列值分别分组值

裁剪数字.nd数组引发-ValueError:无法将空图像写入JPEG

对于标准的原始类型注释,从键入`和`从www.example.com `?

用0填充没有覆盖范围的垃圾箱

有没有一种方法可以根据不同索引集的数组从2D数组的对称子矩阵高效地构造3D数组?

pyspark where子句可以在不存在的列上工作

对列中的数字进行迭代,得到n次重复开始的第一个行号

基于2级列表的Pandas 切片3级多索引

牛郎星直方图中分类列的设置顺序