【问题标题】:Selenium Python: Trying to get an iframe within an iframeSelenium Python:尝试在 iframe 中获取 iframe
【发布时间】:2022-01-09 09:02:10
【问题描述】:

我正在尝试将 Selenium 的“焦点”切换到另一个 iframe 内的 iframe 内的内容。到目前为止,我下面的硒测试似乎有效。但是,我想在该 iframe 中获取另一个 iframe - 但我现在不确定。

这是标记(第二个 iframe 突出显示):

这是我目前的测试(它有效——只是不确定如何在第一个 iframe 中获取第二个 iframe):

import unittest
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from .functional_test import FunctionalTest


class MyTest(FunctionalTest):
    URL = '/datastory/my-datastory/'


    @classmethod
    def setUpClass(cls):
        """Set up method."""
        super().setUpClass()

        cls.URL = cls.format_url(cls.URL)
        cls.login_user(cls)

    def test_iframe(self):
        container = self.browser.find_element_by_id('visual-31')
        carousel = container.find_element_by_css_selector('.col-sm-12:nth-child(2) div.visual #classics-50-carousel')
        wait = WebDriverWait(self.browser, 60)
        wait.until(ec.visibility_of(carousel))
        page_source = carousel.get_attribute("src");
        self.assertEqual(
            page_source,
            'https://observablehq.com/embed/@ddsg/paramount-databyte-visuals?cells=classics50yrs'
        )
        # switch Selenium focus to the iframe
        iframe = self.browser.switch_to.frame(carousel);
        #NOW HOW DO I GET THE OTHER IFRAME??
        # switch back
        self.browser.switch_to.default_content()

【问题讨论】:

标签: python selenium selenium-webdriver iframe webdriverwait


【解决方案1】:

要在嵌套的 <iframe> 元素内切换,您必须:

  • 诱导WebDriverWait 使 框架可用并切换到它

  • 诱导 WebDriverWait 使 child 框架可用并切换到它

  • 然后driver.find_element()

  • 您可以使用以下任一Locator Strategies

    • 使用CSS_SELECTOR

      driver.get('https://xyz/datastory/my-datastory/')
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe.content[src='https://observablehq.com/embed/@ddsg/paramount-databyte-visuals?cells=classics50yrs']")))
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe.content[src*='observableusercontent']")))
      element = driver.find_element(By.ID, "id")
      
    • 使用XPATH

      driver.get('https://xyz/datastory/my-datastory/')
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@class='content' and @src='https://observablehq.com/embed/@ddsg/paramount-databyte-visuals?cells=classics50yrs']")))
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[starts-with(@src, 'observableusercontent')]")))
      element = driver.find_element(By.ID, "id")
      
  • 注意:您必须添加以下导入:

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

参考

您可以在以下位置找到一些相关讨论:

【讨论】:

    猜你喜欢
    • 2018-10-30
    • 2014-06-11
    • 1970-01-01
    • 2016-04-20
    • 2015-10-28
    • 2021-08-14
    • 2021-05-30
    • 2017-03-28
    • 1970-01-01
    相关资源
    最近更新 更多