如何在Playwright中通过列表顺序选择下拉列表的首个选项?
问题描述
我正在开发第一个编码项目:表单填充机器人,需求是无需提前知晓选项值,仅按列表顺序选择下拉列表的首个选项。
目前遇到的问题:该下拉列表会根据输入的名称筛选选项,我已实现输入名称的功能,但流程要求必须强制选中第一个选项。由于无法提前获取所有选项值,因此不能通过选项名称或value值来选择。
下拉列表示例代码
<select id="form:nomeAutor:listbox" name="form:nomeAutor:listbox" class="list-itens-au " size="2" onblur="com.corejsf.inputLostFocus(this)" onkeyup="com.autocomplete.submitEnter(this, event);" style="display: inline; position: absolute; left: 124.765625px; top: 800.109375px" onchange="mojarra.ab(this,event,'valueChange','form:nomeAutor','form:nomeAutor:nomeAutor form:nomeAutor:valueId')"> <option value="2147898">ADAIR JOSE PEREIRA DA ROCHA (Doutorado)</option> <option value="1585496">FERNANDA NADAI (Graduação)</option> </select>
当前代码
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=False) page = browser.new_page() # 添加括号调用函数 page.goto("https://sucupira.capes.gov.br/sucupira/coleta_online/producaoIntelectual/listaProducao.jsf") page.click("a[id='buttonAcessoCapes']") page.fill("input[name='login']",'00000000') page.fill("input[name='senha']",'00000000') page.click("button[id='textoBotao']") page.wait_for_timeout(2000) page.click("a[id='formPortais:portalCoordenadorPrograma']") page.click("a[id='formAbaColeta:btnProducaoIntelectual']") page.wait_for_timeout(3000) page.click("a[id='form:btnCadastrarProducao']") page.fill("input[id='form:nome']",'A relação entre a autoeficácia e o autoconceito em jovens atletas de futebol: uma revisão de escopo.') page.fill("input[id='form:anoPublicacao']",'2022') page.select_option("select[id='form:categoria']", 'Discente' ) page.wait_for_timeout(3000) page.locator("input[name=\"form\\:nomeAutor\\:input\"]").type("ADAIR JOSÉ PEREIRA DA ROCH") page.wait_for_timeout(1000) page.locator("[id=\"form\\:nomeAutor\\:listbox\"]").select_option(all) page.get_by_role("button", name="Adicionar Autor").click(button="left") page.get_by_role("button", name="Próximo >>").click(button="left") page.wait_for_timeout(1000) page.locator("[id=\"form\\:tipo\"]").select_option("2") page.wait_for_timeout(1000) page.locator("[id=\"form\\:subtipo\"]").select_option("25") page.wait_for_timeout(2000)
解决方案
Playwright的select_option方法支持通过索引选择选项,直接指定索引0即可选中第一个选项,无需依赖选项的value或文本。同时建议用元素等待替代固定超时,提升代码稳定性。
修改后的代码如下:
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=False) page = browser.new_page() page.goto("https://sucupira.capes.gov.br/sucupira/coleta_online/producaoIntelectual/listaProducao.jsf") # 登录流程 page.click("a#buttonAcessoCapes") page.fill("input[name='login']", '00000000') page.fill("input[name='senha']", '00000000') page.click("button#textoBotao") page.wait_for_selector("a#formPortais:portalCoordenadorPrograma") page.click("a#formPortais:portalCoordenadorPrograma") # 进入知识产权填报页面 page.click("a#formAbaColeta:btnProducaoIntelectual") page.wait_for_selector("a#form:btnCadastrarProducao") page.click("a#form:btnCadastrarProducao") # 填写基础信息 page.fill("input#form:nome", 'A relação entre a autoeficácia e o autoconceito em jovens atletas de futebol: uma revisão de escopo.') page.fill("input#form:anoPublicacao", '2022') page.select_option("select#form:categoria", 'Discente') # 处理作者下拉选择 page.locator("input[name=\"form\\:nomeAutor\\:input\"]").type("ADAIR JOSÉ PEREIRA DA ROCH") # 等待下拉框加载完成,通过索引选中第一个选项 listbox = page.locator("[id=\"form\\:nomeAutor\\:listbox\"]") listbox.wait_for() listbox.select_option(index=0) # 后续操作 page.get_by_role("button", name="Adicionar Autor").click() page.get_by_role("button", name="Próximo >>").click() page.locator("[id=\"form\\:tipo\"]").select_option("2") page.locator("[id=\"form\\:subtipo\"]").select_option("25") # 可选:关闭浏览器 # browser.close()
关键修改说明
- 将
page.locator("[id=\"form\\:nomeAutor\\:listbox\"]").select_option(all)替换为listbox.select_option(index=0),直接通过索引选中第一个选项 - 用
wait_for_selector或wait_for()替代部分固定超时,避免页面加载慢导致的元素未找到问题 - 简化元素选择器写法(如
a#buttonAcessoCapes等价于a[id='buttonAcessoCapes']),提升代码可读性
内容的提问来源于stack exchange,提问作者Robson martins dos santos
相关产品推荐
相关产品推荐

