如何使用 Selenium 识别 iframe?

How to identify the iframe using Selenium?

HTML:

<iframe allowpaymentrequest="true" allowtransparency="true" src="https://shopify.wintopay.com/
cd_frame_id_="ca9e4ad6a1559de159faff5c1f563d59"
name="WinCCPay"
id="win-cc-pay-frame" 

我正在尝试在抄送字段中输入文本。显然它在 iframe 中我选择了 HTML 中的最后一个并尝试从上面的标识符中 select 它但我一直找不到元素

iframe= wd.find_element_by_id("win-cc-pay-frame")    

wd.switch_to.frame(iframe)

框架当前正在浏览器中显示,因此无需隐式等待。

要识别 所以你必须:

  • 诱导 WebDriverWait 所需的 帧可用并切换到它

  • 您可以使用以下任一项:

    • 使用CSS_SELECTOR:

      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#win-cc-pay-frame[name='WinCCPay'][src^='https://shopify.wintopay.com']")))
      
    • 使用 XPATH:

      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='win-cc-pay-frame' and @name='WinCCPay'][starts-with(@src, 'https://shopify.wintopay.com')]")))
      
  • 注意:您必须添加以下导入:

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

问题可能是元素的名称和 ID 是动态的,并且会随着每次唯一结帐而变化 window?您可以检查是否在 iframe 标记中添加 class 属性并通过该属性查找元素吗?

它必须类似于:

iframe = wd.find_element_by_class_name('card-pay-iframe')
wd.switch_to.frame(iframe)
...
wd.switch_to.default_content()

写得不错! ¯_(ツ)_/¯