You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python+Selenium定位HSBC页面复选框的正确元素

问题:HSBC页面复选框点击失败(No Such Element错误)

我是Python和Selenium新手,在尝试点击HSBC页面的复选框时遇到报错:no such element. Unable to locate element。我的需求是从电子表格导入收款人列表到HSBC,完成后手动提交批量付款,前面的步骤都正常,只有复选框选择环节出错。

页面HTML元素

<td class="Box-sc-qbwqq9-0 TableBodyCell__DefaultBodyCell-sc-cl0sox-0 gijpJg eYTdev sc-hLBbgP cHXHLo">
  <label class="css-1kjmcnq">
    <input class="CheckboxInput-design-system__x7khws-0 hdyOlF" data-testid="Checkbox" data-id="Checkbox" type="checkbox" aria-label="Payee TOBY **** with reference number ******* ******* having sort code 00-00-00 and account number 00000000" aria-checked="false">
    <div data-id="CheckboxBox" class="CheckboxBox-design-system__sc-1ijfz2q-0 ckrTKH small css-4cffwv" mode="light">
      <div display="inline-flex" class="Box-qbwqq9-0 Icon__IconWrapper-y4p3lz-0 blYcNt eYXvhY Icon CheckboxIcon-design-system__sc-1i4adeu-0 fgbehG small" data-testid="Icon-StatusYesThick" data-trackid="Icon-StatusYesThick@1.6.0" data-id="CheckboxIcon">
        <svg class="Box-sc-y5ctq9-0 SvgIcon__SvgIconBox-sc-1vnlbss-0 htGorq boQDDw SvgIcon" focusable="false" viewBox="0 0 18 18" aria-hidden="true" role="presentation" data-testid="StatusYesThickIcon" data-id="Icon" fill="currentColor">
          <path fill="none" d="M0 0h18v18H0z" opacity=".25"></path>
          <path d="M5.916 15.942l-5.81-5.808L1.378 8.86l4.538 4.537L16.622 2.693l1.272 1.274z"></path>
        </svg>
      </div>
    </div>
  </label>
</td>

当前代码

from selenium import webdriver
from openpyxl import workbook, load_workbook
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains

web = webdriver.Chrome()
actions = ActionChains(web)

wb = load_workbook('D:\\Documents\\*******\\HSBCPythonPaymentFile.xlsx', data_only=True, 
read_only=False)
web.get("https://online-banking.business.hsbc.co.uk/portalserver/hsbc/login")
ws = wb.active
x = 52

wb.save('D:\\Documents\\*********\\Musician Payments\\HSBCPythonPaymentFile.xlsx')

while ws.cell(x,1).value !=None:
    musician = ws.cell(x,1).value + " " + ws.cell(x,2).value
    input("Press Enter to continue...")

    musiciansearch = web.find_element_by_xpath('//*[@id="main-container"]/div/div/div/div/div[3]/div[2]/div/div[1]/div[1]/div/input')
    musiciansearch.send_keys(musician)

    actions.send_keys(Keys.TAB)
    actions.send_keys(Keys.TAB)
    actions.send_keys(Keys.ENTER)
    actions.perform()

    element = web.find_element_by_id('Checkbox')
    action = ActionChains(web)
    action.click(on_element= element)

    x = x + 1

解决方案

1. 修正元素定位器

你当前用find_element_by_id('Checkbox')是错误的——复选框没有id属性,只有data-id="Checkbox"和data-testid="Checkbox"。可以改用以下定位方式:

  • 通过data-testid定位:web.find_element_by_css_selector('[data-testid="Checkbox"]')
  • 通过aria-label定位(如果收款人名称唯一):web.find_element_by_css_selector(f'[aria-label*="{musician}"]')

2. 添加显式等待

搜索收款人后页面可能需要加载时间,直接查找元素会导致失败。需导入等待模块确保元素加载完成:

修改后的核心代码片段

# 先导入等待相关模块
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 替换原有的复选框查找和点击代码
try:
    # 等待复选框加载,最长等待10秒
    checkbox = WebDriverWait(web, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, '[data-testid="Checkbox"]'))
    )
    checkbox.click()
except Exception as e:
    print(f"找不到或无法点击复选框: {e}")

3. 其他优化建议

  • 如果页面存在多个复选框,建议结合收款人名称通过aria-label定位,确保点击当前搜索的收款人对应复选框:
    checkbox = WebDriverWait(web, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, f'[aria-label*="{musician}"]'))
    )
    
  • 避免硬编码TAB键切换操作,尽量用显式定位元素完成交互,减少不稳定因素。

内容的提问来源于stack exchange,提问作者Neil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:43:15