如何用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
相关产品推荐
相关产品推荐

