Selenium定位adv_acc_search_table时无<tr>标签运行失败,遗漏了什么?
问题分析&解决建议
- 元素查找逻辑位置错误:你将
visibility_of_any_elements_located查找tr元素的代码放在了try结构之前,当页面不存在匹配的tr标签时,等待会直接抛出TimeoutException,程序直接终止,根本不会进入后续的try分支执行你预设的不存在逻辑。 - 判断条件逻辑错误:你遍历拿到的
account是WebElement对象,无法和数字0做大小比较,你原本要判断的应该是查询到的tr元素列表的总长度是否大于0,而不是遍历每个元素和0做比较。 - 异常捕获语法错误:你当前的
except:后面直接写TimeoutException等于没有任何异常处理逻辑,捕获到异常后会直接跳过,既不会报错也不会执行你预期的else分支逻辑。 - else分支位置错误:你把不存在tr的逻辑写在了for循环内部,哪怕列表有值,第一次循环如果不满足条件也会执行else分支,和你预期的「整个列表为空才执行else」的逻辑完全不符。
修正后可运行代码
from selenium.common.exceptions import TimeoutException try: # 把tr元素查找逻辑移入try块内 adv_acc_search_table = wait.until(EC.visibility_of_any_elements_located((By.CSS_SELECTOR, '[class="standard_table_body"]>table tr'))) if len(adv_acc_search_table) > 0: # 直接取第一个匹配的tr元素点击,无需多余遍历 adv_acc_search_table[0].click() else: # 列表为空时执行无账户的逻辑 print("No Accounts to select") wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '[id="advanced_account_search_window_window_title"] img'))).click() APA = Select(wait.until(EC.visibility_of_element_located((By.ID, 'MLADAT')))) APA.select_by_index(0) # 明确捕获tr不存在时抛出的超时异常,对应无tr的场景 except TimeoutException: print("No Accounts to select") wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '[id="advanced_account_search_window_window_title"] img'))).click() APA = Select(wait.until(EC.visibility_of_element_located((By.ID, 'MLADAT')))) APA.select_by_index(0)
可选优化点
- 可以把无账户的重复逻辑封装成独立函数,减少代码冗余
- 如果需要兼容页面加载慢的场景,可以适当调整wait的超时时间,避免正常有tr的场景误判为不存在
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

