【问题标题】:Selenium web driver cannot find buttonSelenium Web 驱动程序找不到按钮
【发布时间】:2022-01-05 10:47:06
【问题描述】:

我正在使用 Selenium 4 和 Firefox Gecko Web 驱动程序制作 Python 3 脚本。

目标很简单:

  • 打开网页
  • 点击蓝色的“Greit”按钮接受 cookie

到目前为止,这是我的 Python 3 脚本,但它没有按预期工作。该脚本似乎没有找到该按钮。也许是因为它不是初始 DOM 的一部分。它是由一个 javascript 弹出窗口触发的。

from selenium import 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://examplepage.com'

driver = webdriver.Firefox()
driver.get(URL)

time.sleep(2)

print(driver.page_source)

wait = WebDriverWait(driver, 5)
wait.until(ec.visibility_of_element_located((By.XPATH, '//button[text()="Greit"]')))
driver.find_element(By.XPATH, '//button[text()="Greit"]').click()

driver.quit()

我该怎么做才能让 selenium 找到按钮并单击它?弹出窗口的 HTML 在 DevTools 检查中可用,但在页面源中不可用。

【问题讨论】:

    标签: python python-3.x selenium selenium-webdriver iframe


    【解决方案1】:

    您尝试点击的元素位于 iframe 中。
    因此,您首先必须切换到该 iframe,然后单击该元素。
    这应该有效:

    from selenium import 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
    
    wait = WebDriverWait(driver, 10)
    
    wait.until(ec.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[contains(@id,'sp_message')]")))
    
    wait.until(ec.visibility_of_element_located((By.XPATH, "//button[@title='Greit']"))).click()
    
    driver.quit()
    

    顺便说一句,您可以将等待超时设置得更大一些,通常设置为 20 或 30 秒。使用这些超时没有问题,因为一旦找到一个元素,Selenium 将立即继续执行下一个命令。另一方面,您不希望您的测试因为网速慢而失败。
    此外,使用wait 后,您无需再次获取该元素。此方法返回 web 元素,因此您可以按照我在代码中显示的方式使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      • 2016-12-16
      • 1970-01-01
      • 2014-05-30
      • 2016-11-02
      • 2023-03-13
      • 2017-08-15
      相关资源
      最近更新 更多