【问题标题】:How to know if an element is in an iframe or not?如何知道元素是否在 iframe 中?
【发布时间】:2020-06-25 16:58:06
【问题描述】:

如何知道一个元素是否在 iframe 中?

我想了解如何查看我们正在搜索的元素是否在 iframe 中。在看到有关它的 stackoverflow 之前,我无法在网站中找到提交按钮。他们说提交按钮在 iframe 中。当我查看源代码时,我看不到任何 iframe。

<button type="submit" class="btn btn-submit" name="submitBtn">Créer un compte</button>

如果你想看看网站:https://mail.protonmail.com/create/new?language=en

【问题讨论】:

  • 在浏览器中打开页面源 HTML (Ctrl+U) 并搜索 iframe (Ctrl+F)。最终在浏览器中看到DevTools中的HTML,并且还有在HTML中搜索一些文本的功能。
  • 顺便说一句:如果页面使用 JavaScript 添加元素,那么您可能必须等到 JavaScript 添加此元素。您可以尝试使用time.sleep(seconds) 或 Selenium 有方法等待元素。见Waits
  • 你可以随时使用driver.find_elements_by_tag_name('iframe')查看是否有iframes
  • 是的,该按钮存在于iframe 中,页面上有两个iframes,并且该iframe 中存在按钮//iframe[@title='Registration form' and @data-name='bottom']

标签: python selenium selenium-webdriver iframe


【解决方案1】:

通常您可以使用Ctrl+U 在浏览器中查看源HTML,然后您可以使用Ctrl+F 搜索任何文本,即。 iframe。但是Ctrl+U 提供了来自服务器的原始 HTML,而没有 JavaScript 添加的元素。但大多数情况下iframe 是原始 HTML,并且这种方法有效。

但如果页面使用 JavaScript 来添加 iframe,那么您可能需要在 Firefox/Chrome 中添加 DevTools 才能看到包含所有添加元素的 HTML。


你也可以使用 Selenium 来检查是否有iframe - 即。

driver.find_elements_by_tag_name('iframe')

但如果页面使用 JavaScript 添加 iframe 则可能需要等待新元素。

你可以使用原始但容易记住

time.sleep(seconds)

Selenium 具有检查元素是否在页面上的方法 - 请参阅文档Waits

因为找不到元素时可能会报错,所以需要try/except,代码比较长。

wait = WebDriverWait(driver, 5)

try:
    wait.until(EC.presence_of_element_located((By.TAG_NAME, "iframe")))
except Exception as ex:
    #print(ex)
    print('len(all_iframes): 0')

顺便说一句:它可以使用selenium.common.exceptions.TimeoutException而不是Exception,但它更难记住所以我在这里跳过它。


此代码使用time.sleep() 等待。

顺便说一句:要切换到下一个iframe,你必须先回到主框架。如果不切换,它可能会在当前iframe 中搜索下一个iframe

import selenium.webdriver
import time

url = 'https://mail.protonmail.com/create/new?language=en'

driver = selenium.webdriver.Firefox()
driver.get(url)

time.sleep(5) # JavaScript may need some time to add all elements

all_iframes = driver.find_elements_by_tag_name('iframe')
print('len(all_iframes):', len(all_iframes))

for number, frame in enumerate(all_iframes):
    print('--- frame:', number, '---')
    
    # switch to iframe
    driver.switch_to.frame(frame)

    # search buttons in iframe
    all_buttons = driver.find_elements_by_tag_name('button')
    print('len(all_buttons):', len(all_buttons))
    
    # go back to main frame
    driver.switch_to.default_content()

结果:

len(all_iframes): 2
--- frame: 0 ---
len(all_buttons): 0
--- frame: 1 ---
len(all_buttons): 1

编辑:

带有WebDriverWait 的版本,但它也需要等待buttons,因为它不会等待整整5 秒,而是在找到iframes 时立即尝试搜索buttons,但JavaScript 可能还需要时间在iframe中添加按钮

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

url = 'https://mail.protonmail.com/create/new?language=en'

driver = selenium.webdriver.Firefox()
driver.get(url)

#time.sleep(5) # JavaScript may need time to add all elements
wait = WebDriverWait(driver, 5)

try:
    wait.until(EC.presence_of_element_located((By.TAG_NAME, "iframe")))
except Exception as ex:
    #print(ex)
    print('len(all_iframes): 0')

all_iframes = driver.find_elements_by_tag_name('iframe')
print('len(all_iframes):', len(all_iframes))

for number, frame in enumerate(all_iframes):
    print('--- frame:', number, '---')

    # switch to iframe
    driver.switch_to.frame(frame)

    try:
        wait.until(EC.presence_of_element_located((By.TAG_NAME, "button")))
        
        all_buttons = driver.find_elements_by_tag_name('button')
        print('len(all_buttons):', len(all_buttons))
    except Exception as ex:
        #print(ex)
        print('len(all_buttons): 0')
        
    # go back to main frame
    driver.switch_to.default_content()

【讨论】:

    【解决方案2】:

    右键单击按钮,如果它在框架内,它会显示框架选项,参考这篇文章--https://www.guru99.com/handling-iframes-selenium.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      相关资源
      最近更新 更多