Selenium 和非 select 下拉列表

Selenium and non select dropdown list

您知道是否可以在非 select 下拉列表中使用 selenium 单击吗?

我需要与这个网站互动:https://ec.europa.eu/info/funding-tenders/opportunities/portal/screen/opportunities/projects-results

然后点击“按节目筛选”,然后 return 抓取到第一页。

下拉导航

下拉列表中的元素通常隐藏,直到启动下拉列表。知道这一点后,在单击列表中的任何元素之前,必须先单击 下拉列表 。有关基本示例,请参见以下代码:

from selenium import webdriver

driver = webdriver.Chrome()

dropdown_list = driver.find_element_by_xpath("XPATH_OF_DROPDOWN_LIST")
dropdown_list.click()

dropdown_element = driver.find_element_by_xpath("XPATH_OF_DROPDOWN_ELEMENT")
dropdown_element.click()

WebDriverWait

对于更高级和性能更好的示例,我建议实施 WebDriverWait 因为有时 的元素之间存在滞后下拉列表可用:

dropdown_element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "XPATH_OF_DROPDOWN_ELEMENT")))

额外资源

对于那些不熟悉的人, time.sleep 和 WebDriverWait 之间的 区别在于 time.sleep 将始终等待 N N 为 time.sleep(N) 的秒数。然而,WebDriverWait 将 等待 N 秒,其中 N 是 WebDriverWait(driver, N)。意思是如果 WebDriverWait 变量设置为 10 秒,但元素在 2 秒后变为可用,驱动程序将在 2 秒内执行操作并转到下一个命令。 但是如果元素需要超过10秒出现,程序会抛出超时异常。

Filter by programme 下拉列表在单击 <label> 元素时打开。


解决方案

要单击并展开下拉列表,您需要诱导 WebDriverWait for the and you can use either of the following :

  • 使用 XPATH:

    driver.get("https://ec.europa.eu/info/funding-tenders/opportunities/portal/screen/opportunities/projects-results")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.wt-cck-btn-add"))).click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[text()='Select a Programme...']"))).click()
    
  • 注意:您必须添加以下导入:

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