【问题标题】:How to click pop up window button within a iframe using Selenium with Pyhton如何使用 Selenium 和 Python 在 iframe 中单击弹出窗口按钮
【发布时间】:2021-01-29 04:44:09
【问题描述】:

我想点击“Akkoord”按钮,但我做不到。我已经尝试了不同的方法,但它们不起作用。任何帮助将不胜感激。

我尝试过的代码之一。

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import time

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://www.demorgen.be/nieuws')

time.sleep(20)
driver.find_elements_by_class_name('message-component message-button no-children pg-accept-button')[0].click() 

【问题讨论】:

    标签: python selenium-webdriver xpath iframe css-selectors


    【解决方案1】:

    元素 Akkoord 位于 <iframe> 内,因此您必须:

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

    • 诱导WebDriverWait 使所需的元素可点击

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

      • 使用CSS_SELECTOR

        driver.get("https://www.demorgen.be/nieuws")
        WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[id^='sp_message_iframe']")))
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[aria-label='Akkoord']"))).click()
        
      • 使用XPATH:

        driver.get("https://www.demorgen.be/nieuws")
        WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[starts-with(@id, 'sp_message_iframe')]")))
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@aria-label='Akkoord']"))).click()
        
    • 注意:您必须添加以下导入:

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      
    • 浏览器快照:


    参考

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

    【讨论】:

      【解决方案2】:

      使用 xpath 或 css

      css:

      [class="message-component message-button no-children pg-accept-button"]
      
      
      driver.find_elements_by_css_selector('[class="message-component message-button no-children pg-accept-button"]')[0].click() 
      

      xpath:

      //*[@class="message-component message-button no-children pg-accept-button"]
      
      driver.find_elements_by_xpath('//*[@class="message-component message-button no-children pg-accept-button"]')[0].click() 
      

      find_elements_by_class_name 需要单个类名作为参数,这就是为什么它不能作为类中的空格表示多个类。

      按类查找实际上在后台使用 css。因此,如果您想查找具有多个 class 的元素。您可以用“。”替换空格。 (这只适用于python)

      driver.find_elements_by_class_name('message-component.message-button.no-children.pg-accept-button')[0].click() 
      

      还有

      元素在 iframe 内

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      
      
      
      frame = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR,
          "#sp_message_container_404503 iframe")))
      driver.switch_to_frame(frame)
      driver.find_element_by_css_selector(
          '[class="message-component message-button no-children pg-accept-button"]').click()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多