【问题标题】:Timeout Waiting for Visible iframe超时等待可见 iframe
【发布时间】:2019-04-30 23:22:51
【问题描述】:

我正在使用 Python 学习 Selenium,并尝试为网站编写快乐的路径流。我卡住的地方是点击弹出窗口后自动启动 iframe 的流程的一部分。我尝试了几种不同的方法,但无法找到框架,或者等待它出现。要么找不到,要么超时。

WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.ID, 'continue-  reservation'))).click()


# cvv2 form
WebDriverWait(driver, 5).until(EC.frame_to_be_available_and_switch_to_it((By.ID, 'cvv_iframe')))

错误:

WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.ID, 'cvv_iframe')))
File "/Users/anutter/venv/lib/python3.7/site-packages/selenium/webdriver/support/wait.py", line 80, in until
raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:

HTML如下:

                <div id="cpstaging" class="emptystage">
                    <div class="fixed h-v-centered new-preload" style="display: none;"><span class="fa fa-spinner f-50 f-grn fa-pulse"></span></div>
                </div>
                <div id="cvv-box" class="pad-30-lr">
                    <div id="enter-cvv-title" class="blk mar-20-b f-18 border-b pad-10-b">Enter CVV Code</div>
                    <iframe src="https://qa-hotels.ecbsn.com/cvv?oauth_token=u7q99%2Fe8I%2BkUrkLMr4dGR2t4gmcDbVtr&amp;type=visa&amp;src=web-desktop" id="cvv_iframe" name="cvv_iframe" width="430" height="160" frameborder="0" seamless="seamless" scrolling="no" sandbox="allow-same-origin allow-scripts allow-popups allow-forms"></iframe>
                </div>
            </div>
        </div>
    </div>

【问题讨论】:

标签: python-3.x selenium-webdriver xpath iframe css-selectors


【解决方案1】:

根据您共享的 HTML,要访问 &lt;iframe&gt; 中的元素,您必须:

  • 使用Locator Strategies 中的任何一个来WebDriverWait 使所需的框架可用并切换到它

    • 使用ID

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"cvv_iframe")))
      
    • 使用NAME

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.NAME,"cvv_iframe")))
      
    • 使用CSS_SELECTOR

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#cvv_iframe[name='cvv_iframe']")))
      
    • 使用XPATH

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='cvv_iframe' and @name='cvv_iframe']")))
      
  • 注意:根据您的代码试验,&lt;iframe&gt;ID 不是 cvv-iframe 而是 cvv_iframe

    李>

在这里你可以找到Ways to deal with #document under iframe的相关讨论

【讨论】:

  • 天啊,这非常明显。不幸的是,在更正 iframe 名称后,我仍然遇到超时异常。也许我没有使用正确的 ID?我尝试了其他几个 ID,以及使用 CSS 选择器,但都没有成功。
  • @anutter 您的评论对我也没有帮助。抱歉,答案并没有帮助您解决问题,但是我将如何根据这些反馈改进我的帖子?
  • 我更新了错误的描述,以及页面的更多 HTML,不知道我还可以添加什么来使我的问题更清晰?
猜你喜欢
  • 1970-01-01
  • 2012-04-19
  • 2012-09-20
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 2023-03-09
  • 2020-05-20
  • 1970-01-01
相关资源
最近更新 更多