Можно найти элемент внутри iframe, используя Firefox, но не Chrome - PullRequest
0 голосов
/ 30 января 2020

Итак, я пытаюсь написать тест для веб-страницы, в которой есть несколько элементов в iframe. Я смог успешно выполнить тест с использованием веб-драйвера. Firefox () без каких-либо проблем, но если я переключаю его на веб-драйвер. Chrome () я получаю исключение тайм-аута в следующих строках кода:

 self.driver.switch_to.frame(0)
 self.activity_status = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, '#overview > div.details.w-66 > div > div.duration-and-status > span.status.stat_incomplete#')))

Было бы замечательно получить решение этой проблемы, поскольку у меня нет идей.

Спасибо за вашу помощь.

edit, частично html for страница:

<iframe id="iframe_course_details" allowfullscreen="" src="../Course/Details.aspx?HidePageNav=true&amp;IsInIframe=true"></iframe>

Закрыть Редактировать (Неактивно) Редактировать

        <span id="ctl00_cph_main_content_area_ucCourseDetails_spn_favourite" class="favourite button tooltipstered" style="display: none;">Favourite</span>
        <span id="ctl00_cph_main_content_area_ucCourseDetails_spn_basket_dull" class="add-to-basket button delete tooltipstered" style="display: none;">Enrolled (Remove From Enrolments)</span>
        <span id="ctl00_cph_main_content_area_ucCourseDetails_spn_basket" class="add-to-basket button tooltipstered">Add to Enrolments</span>
        <span id="ctl00_cph_main_content_area_ucCourseDetails_spn_print" class="print button tooltipstered">Print</span>
    </div>
    <section id="overview" style="opacity: 1;">
        <div id="fullname" class="fullname w-100" style="display: none;">

        </div>
        <div class="image w-33" style="cursor: pointer;">
        <div style="background-image:url(/App_Themes/MainTheme-responsive/Images/Course/webcast.jpg);"></div></div>
        <div class="details w-66">
            <div class="inner">
                <h2>testing activity</h2>
                <div class="star-rating-num-ratings">
                    <div class="star-rating">
                        <span></span><span></span><span></span><span></span><span></span>
                    </div>
                    <span class="num-of-ratings">0 Ratings</span>
                </div>
                <div class="duration-and-status">
                    <span class="duration">
                        <label>
                            Duration:
                        </label>
                        <span>0</span>
                    </span>
                    <span class="status stat_incomplete">Started</span>
                </div>          

Редактировать 2:

Итак, нам удалось найти решение этой проблемы и даже ее более запутанная, чем исходная проблема

WebDriverWait(self.driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.ID, 'iframe_course_details')))
    time.sleep(0)
    self.activity_status = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="overview"]/div[3]/div/div[2]/span[2]')))

Мне было бы очень любопытно услышать некоторые теории о том, почему это работает, время ожидания без 'time.sleep (0).

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Поскольку требуемый элемент находится в пределах <iframe>, поэтому для вызова click() на элементе необходимо:

  • Ввести WebDriverWait для требуемого кадр должен быть доступен и переключиться на него .

    • Кодовый блок:

      # as per your comment assuming -> there is only one frame on the page
      WebDriverWait(self.driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.TAG_NAME,"iframe")))
      self.element = self.activity_status = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, '#overview > div.details.w-66 > div > div.duration-and-status > span.status.stat_incomplete#')))
      
    • Примечание : Вы должны добавить следующие импорты:

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      

Ссылка

Вы можете найти соответствующее подробное обсуждение в :

0 голосов
/ 03 февраля 2020

Если вы ссылаетесь на iframe напрямую, а не на целое число, которое будет работать между Firefox / Chrome.

self.driver.switch_to.frame(driver.find_element_by_name("iframe"))

Вы можете найти элемент iframe любым способом, которым вы будете sh, например, css / xpath и др c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...