Python Selenium点击Zerodha Table View切换按钮失败求修复
问题修复方案
核心错误分析
你代码里的关键问题是错误使用了By.TAG_NAME定位方式:browser.find_element(By.TAG_NAME,value='ciq-DT tableview-ui')。TAG_NAME仅能匹配单个HTML标签名(这里目标元素的标签是cq-toggle),而你传入的是两个类名,这直接导致元素定位失败。
具体修复步骤
1. 替换为正确的元素定位方式
针对目标元素的HTML结构:
<cq-toggle class="ciq-DT tableview-ui" cq-member="tableView"> <span></span> <cq-tooltip>Table View</cq-tooltip> </cq-toggle>
推荐以下几种稳定的定位方式:
方式一:CSS选择器(优先使用)
通过多个class组合定位,用.连接不同class:
browser.find_element(By.CSS_SELECTOR, "cq-toggle.ciq-DT.tableview-ui").click()
方式二:XPath定位
可以通过class组合或内部tooltip文本定位(后者更稳定):
# 通过class组合定位 browser.find_element(By.XPATH, "//cq-toggle[@class='ciq-DT tableview-ui']").click() # 通过内部tooltip文本定位 browser.find_element(By.XPATH, "//cq-toggle[cq-tooltip/text()='Table View']").click()
2. 用显式等待替代硬编码sleep
你当前用time.sleep(10)等待页面加载,这种方式既不稳定又低效。建议用Selenium的显式等待,确保元素完全可点击后再操作:
首先导入所需模块:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC
然后替换原有的等待和点击代码:
browser.get('https://kite.zerodha.com/chart/ext/ciq/BSE/SBIN/128028676') # 最长等待15秒,直到按钮可点击 table_view_btn = WebDriverWait(browser, 15).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "cq-toggle.ciq-DT.tableview-ui")) ) table_view_btn.click()
3. 检查iframe嵌套情况
如果上述方法仍无法定位元素,需确认目标元素是否在<iframe>内部:
- 打开浏览器开发者工具(F12),查看目标元素是否被包含在
<iframe>标签中。 - 若存在iframe,需先切换到iframe再定位:
# 示例:通过tag name定位iframe,实际需根据页面结构调整 iframe = browser.find_element(By.TAG_NAME, "iframe") browser.switch_to.frame(iframe) # 执行元素定位和点击 table_view_btn = WebDriverWait(browser, 15).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "cq-toggle.ciq-DT.tableview-ui")) ) table_view_btn.click() # 操作完成后回到主文档(如需) browser.switch_to.default_content()
完整修复后的代码片段
from selenium import webdriver from selenium.webdriver.firefox.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC opts = Options() # opts.set_headless() # assert opts.headless # Operating in headless mode browser = Firefox(options=opts) browser.implicitly_wait(3) browser.get('https://kite.zerodha.com') # 登录操作 browser.find_element(By.ID, 'userid').send_keys('XXXXXX') browser.find_element(By.ID, 'password').send_keys('XXXXX') browser.find_element(By.ID, 'password').submit() # 显式等待登录跳转完成 WebDriverWait(browser, 15).until( EC.url_contains('dashboard') ) browser.get('https://kite.zerodha.com/chart/ext/ciq/BSE/SBIN/128028676') # 等待Table View按钮并点击 table_view_btn = WebDriverWait(browser, 15).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "cq-toggle.ciq-DT.tableview-ui")) ) table_view_btn.click()
内容的提问来源于stack exchange,提问作者Rohan Bhanu
相关产品推荐
相关产品推荐

