Selenium切换iframe报错:find_element()参数数量不符
问题:WebDriver切换iframe时触发位置参数错误
问题背景
此前可正常运行的WebDriver切换iframe逻辑,现在抛出TypeError,提示find_element() takes from 1 to 3 positional arguments but 11 were given。
运行的代码片段
driver.get(mastercon) driver.switch_to.default_content() wait(driver, 120).until(EC.frame_to_be_available_and_switch_to_it('iframe_cbk')) sleep(40)
报错信息
TypeError Traceback (most recent call last) Input In [13], in <cell line: 3>() 1 driver.get(mastercon) 2 driver.switch_to.default_content() ----> 3 wait(driver, 120).until(EC.frame_to_be_available_and_switch_to_it("iframe_cbk")) 4 sleep(40) 6 #driver.switch_to_frame('iframe_cbk') 7 8 #Dashboard/Filter File ~\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\support\wait.py:78, in WebDriverWait.until(self, method, message) 76 while True: 77 try: ---> 78 value = method(self._driver) 79 if value: 80 return value File ~\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\support\expected_conditions.py:256, in frame_to_be_available_and_switch_to_it.<locals>._predicate(driver) 254 try: 255 if hasattr(locator, '__iter__'): ---> 256 driver.switch_to.frame(driver.find_element(*locator)) 257 else: 258 driver.switch_to.frame(locator) TypeError: find_element() takes from 1 to 3 positional arguments but 11 were given
完整代码块
# change frame do_dispute = [] for tx_dispute,refund_date in zip(df_refund.claim_id,df_refund.refund_date): try: driver.get(mastercon) driver.switch_to.default_content() wait(driver, 120).until(EC.frame_to_be_available_and_switch_to_it("iframe_cbk")) sleep(40) #driver.switch_to_frame('iframe_cbk') #Dashboard/Filter sleep(15) driver.find_element_by_css_selector(dashboard_slash_filter_button).click() #New Filter sleep(15) driver.find_element_by_css_selector(new_filter_button).click() # Insert claim_id in text box Claim Manager ID sleep(8) driver.find_element_by_css_selector(text_box_claim_id).send_keys(tx_dispute) # Click to search for transaction sleep(4) driver.find_element_by_css_selector(search_tx).click()
解决方法
该错误源于Selenium 4+版本中EC.frame_to_be_available_and_switch_to_it()的参数处理逻辑变更:直接传入字符串ID时,代码会误将字符串拆解为单个字符的可迭代对象,导致find_element()接收过多参数。
提供两种修复方案:
方案一:明确指定定位方式
将iframe的ID封装为元组,传入定位器类型和值:# 需提前导入By from selenium.webdriver.common.by import By wait(driver, 120).until(EC.frame_to_be_available_and_switch_to_it((By.ID, 'iframe_cbk')))方案二:拆分等待与切换逻辑
先等待iframe存在,再执行切换操作:wait(driver, 120).until(EC.presence_of_element_located((By.ID, 'iframe_cbk'))) driver.switch_to.frame('iframe_cbk')
额外建议:代码中大量使用sleep()会降低稳定性和效率,建议全部替换为显式等待,例如点击按钮时使用EC.element_to_be_clickable()。
内容的提问来源于stack exchange,提问作者João Vitor
相关产品推荐
相关产品推荐

