【问题标题】:Locating iframes in Python with Selenium webdriver使用 Selenium webdriver 在 Python 中定位 iframe
【发布时间】:2018-04-11 14:40:32
【问题描述】:

我必须找到 iframe,我的 html 源代码看起来像

<iframe border="0" scrolling="yes" src="problem_list.do?sysparm_query=u_service_ticket_triage_group.name!%3Dxbt%20tech%20support%5Eu_program.name%3DTX_STAAR%5Eu_reject_ticket!%3Dtrue" name="TribName" width="100%" allowtransparency="true" style="width: 100% !important; height: 800px !important;" frameborder="0" id="TribID"></iframe>

我尝试使用 id 和 name 来定位此 iframe,但出现错误

“没有这样的元素:无法找到元素:”

以下是我尝试过的一次

iframe = driver.find_element_by_name("TribName")
driver.switch_to.frame(iframe)

iframe = driver.find_element_by_id("TribID")
driver.switch_to.frame(iframe)

您能否建议我如何选择此 iframe。

【问题讨论】:

    标签: python selenium iframe


    【解决方案1】:

    根据您提供的要切换到所需框架的 HTML,您需要使用 WebDriverWait 以使框架可用,然后使用任一方法进行切换:

    • 通过Frame ID

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC    
      # lines of code 
      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"TribID")))
      
    • 通过框架名称

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC    
      # lines of code         
      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.NAME,"TribName")))
      

    【讨论】:

    • WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it(driver.find_element_by_id("TribID"))) ,得到错误消息:没有这样的元素:无法找到元素:
    • @Nav 我的解决方案不包括 driver.find_element_by_id("TribID")By.NAME,"TribName"
    • 谢谢,但是当我按照你建议的方式使用时,我得到错误 NameError: name 'By' is not defined
    • @Nav 那是我的错,添加了相关的import 并且应该可以完美运行。让我知道状态。
    • 发表了一个新问题,您的帮助可能会有所帮助。
    【解决方案2】:

    iframe 可能是动态生成的,因此您可能需要明确等待它的出现:

    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import WebDriverWait as wait
    
    wait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it("TribID"))
    

    在嵌套框架的情况下,例如

    <iframe id="OuterFrame">
        <iframe id="TribID"></iframe>
    </iframe>
    

    您应该从高级祖先开始依次切换到每一帧:

    driver.switch_to.frame("OuterFrame")
    driver.switch_to.frame("TribID")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多