可以使用Firefox而不是Chrome浏览器在iframe中查找元素

问题描述 投票:0回答:2

因此,我正在尝试为iframe中包含某些元素的网页编写测试。我已经能够成功使用webdriver.Firefox()成功运行测试,而没有任何问题,但是如果将其切换到webdriver.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#')))

很高兴得到解决方案,因为我全都没有想法。

感谢您的帮助。

编辑,页面的部分html:

<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)的情况下超时了。

python selenium selenium-chromedriver webdriverwait selenium-firefoxdriver
2个回答
0
投票

如果直接引用iframe,而不是在Firefox / Chrome之间可以使用的整数。

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

您可以通过css / xpath等以任何方式找到iframe元素


0
投票

由于所需元素在<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#')))

  • Note

  • :您必须添加以下导入:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC

参考

您可以在以下位置找到相关的详细讨论:

© www.soinside.com 2019 - 2024. All rights reserved.