可以使用Firefox在iframe中找到元素,但不能使用Chrome



所以我正在尝试为iframe中具有一些元素的网页编写一个测试。我已经能够使用网络驱动程序成功运行测试。火狐((没有任何问题,但如果我将其切换到网络驱动程序。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( 它会超时。

如果你直接引用iframe,而不是一个在Firefox/Chrome之间工作的整数。

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

你可以找到任何你想要的iframe元素,例如通过css/xpath等

由于所需的元素在<iframe>内,因此要对该元素调用click()

,您必须:
  • 诱导WebDriver等待所需的帧可用并切换到它

    • 代码块:

      # 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
      

参考

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

  • iframe 下处理 #document 的方法

相关内容

最新更新