【问题标题】:Selenium: Can't click on a button within an iframeSelenium:无法单击 iframe 中的按钮
【发布时间】:2021-01-08 22:35:09
【问题描述】:

我用 selenium 加载页面:http://www.legorafi.fr/ 接下来我尝试单击“Tout Accepter”按钮,但即使使用 css 选择器它也不起作用。这是为了饼干。

我尝试过这样的事情:

driver.find_element_by_css_selector('').click()

这是带有文本“Tout Accepter”的蓝色按钮

我该怎么办?

【问题讨论】:

    标签: python selenium xpath css-selectors webdriverwait


    【解决方案1】:

    元素 Tout Accepter<iframe> 内,因此您必须:

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

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

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

    • 使用CSS_SELECTOR

      driver.get('http://www.legorafi.fr/')
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"div#appconsent>iframe")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.button--filled>span.baseText"))).click()
      
    • 使用XPATH

      driver.get('http://www.legorafi.fr/')
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//div[@id='appconsent']/iframe")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[contains(@class, 'button--filled')]/span[contains(@class, 'baseText')]"))).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】:

      该元素存在于iframe 中,您需要切换iframe 才能访问该元素。

      诱导WebDriverWait() 并等待frame_to_be_available_and_switch_to_it() 和后面的css选择器

      诱导WebDriverWait() 并等待element_to_be_clickable() 并跟随xpath

      driver.get("http://www.legorafi.fr/")
      WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"#appconsent>iframe")))
      WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//span[text()='Tout Accepter']"))).click()
      

      您需要导入以下库

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

      【讨论】:

        【解决方案3】:

        先切换到横幅框,然后点击接受按钮:

        from selenium import webdriver
        
        url = "http://www.legorafi.fr/"
        driver = webdriver.Chrome()
        driver.get(url)
        driver.switch_to.frame(2)
        button = "/html/body/div/div/article/div/aside/section[1]/button"      
        driver.find_element_by_xpath(button).click()
        

        (我使用 XPath 单击按钮,但这只是个人喜好)

        希望对您有所帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-30
          相关资源
          最近更新 更多