【问题标题】:WebDriver' object has no attribute 'switch_to_frame'WebDriver' 对象没有属性 'switch_to_frame'
【发布时间】:2022-01-08 20:32:02
【问题描述】:

我无法切换到成功识别的 iFrame。该脚本识别 iFrame(在调试器中检查),但切换到 iFrame 失败并进入异常陷阱。几次前它完美运行。

Message='WebDriver' object has no attribute 'switch_to_frame'

这期间发生了什么?

Chromedriver 已从版本 95.0.4638.17 更新到 ChromeDriver 96.0.4664.45

Chromedriver 是否不再兼容最新的 Selenium 版本?

... 
driver.switch_to.default_content()

try:
    # find the frame
    wait.until(EC.element_to_be_clickable((By.ID, "wysiwygTextarea_ifr")))
    frame2 = driver.find_element(By.XPATH, "//iframe[@id='wysiwygTextarea_ifr']");
    
    # switch to frame
    driver.switch_to.frame(frame2.tag_name);

    print("--------------iframe found-------------------"); 
except:
    print("--------------iframe not found-------------------");

...

【问题讨论】:

  • 再一次,我记得 Selenium 确实赞助了一次更新。
  • 我可以再在这里添加一次。今天我可以配置它为什么按照 DebanjanB 的建议工作,而下次它不再工作了。当我通过开发环境从 Selenium 4.x 降级到 3.x 时,所有脚本现在都可以完美运行。
  • 或仅通过 pip install -U selenium 更新 Selenium 并且不要在顶部安装新的 Selenium,这意味着 Selenium Mix。问题解决了!!!

标签: python selenium selenium-webdriver iframe frame


【解决方案1】:

在切换到 frame 时,支持的符号是:

  • 使用框架名称切换到一个框架:

    driver.switch_to.frame('frame_name')
    
  • 使用帧索引切换到一个帧:

    driver.switch_to.frame(1)
    
  • 使用框架元素切换到框架:

    driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])
    
    • 切换到父框架:

      driver.switch_to.parent_frame()

  • 切换到默认内容

    driver.switch_to.default_content()
    

这个用例

切换你使用的框架:

driver.switch_to.frame(frame2.tag_name);

即不支持的TAG_NAME。因此您会看到错误:

Message='WebDriver' object has no attribute 'switch_to_frame'

解决方案

你可以使用下面这行代码:

# find the frame
wait.until(EC.element_to_be_clickable((By.ID, "wysiwygTextarea_ifr")))
frame2 = driver.find_element(By.XPATH, "//iframe[@id='wysiwygTextarea_ifr']");
    
# switch to frame by frame element
driver.switch_to.frame(frame2);

【讨论】:

  • 好吧,这解决了我的问题,虽然我之前也只使用了“frame2”(可能是一个错字未被发现)。不管怎样,谢谢你在这个问题上的支持。
  • 这不是一个错字,但我猜这种语法可能已从旧驱动程序版本中弃用,现在仅支持 driver.switch_to.frame(#)。我们有一个应用程序与您的问题具有相同的语法并且开始失败/出错(不确定从什么时候开始,但是当我开始调试失败时)并且这个答案有助于解决它。
猜你喜欢
  • 2022-11-24
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 2022-06-29
  • 2022-06-25
  • 2022-11-19
  • 2023-01-07
  • 2016-10-14
相关资源
最近更新 更多