Тайм-аут в ожидании видимого iframe - PullRequest
0 голосов
/ 29 ноября 2018

Я изучаю Selenium с помощью Python и пытаюсь написать счастливый путь для веб-сайта.То, где я застреваю, является частью потока, в котором 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>

1 Ответ

0 голосов
/ 29 ноября 2018

В соответствии с HTML , которым вы поделились для доступа к элементам в <iframe>, вам необходимо:

  • Induce 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']")))
      
  • Примечание: в соответствии с испытаниями вашего кода ID из <iframe> неcvv-iframe, но cvv_iframe

Здесь вы можете найти соответствующее обсуждение Способы работы с #document в iframe

...