【问题标题】:Python - Selenium - Cycling through drop-down menu - Option not visiblePython - Selenium - 通过下拉菜单循环 - 选项不可见
【发布时间】:2018-11-04 05:14:48
【问题描述】:

上下文:我正在尝试从该网页检索有关 2015 年哥伦比亚市政选举数据的信息:https://elecciones.registraduria.gov.co:81/esc_elec_2015/99AL/DAL01004ZZZZZZZZZZZZ_L1.htm

作为起点,我已经使用 BeautifulSoup (15.152) 成功地收集了 Abejorral 市的登记选民数量(“personas habilitadas”)。下一步是对所有市政当局(“municipios”)执行相同的操作。

为了做到这一点,我试图绕过 Python 3.5 中的 Selenium 以循环浏览“Municipio”下拉菜单,以便我可以一一选择每个 municipio 并检索“personas habilitadas”的相应数字.我目前面临的问题是我无法告诉 Selenium 在下拉菜单中选择另一个选项/市镇,例如“Abriaqui”。相应的 HTML 代码在这里(特意缩短选项列表):

<select id="combo3" class="chosen-select" style="display: none;">
   <option value="../99AL/DAL01ZZZZZZZZZZZZZZZ_L1.htm">Todos</option>
   <option selected="selected" value="../99AL/DAL01004ZZZZZZZZZZZZ_L1.htm">ABEJORRAL</option>
   <option value="../99AL/DAL01007ZZZZZZZZZZZZ_L1.htm">ABRIAQUI</option>
   <option value="../99AL/DAL01010ZZZZZZZZZZZZ_L1.htm">ALEJANDRIA</option>
   <option value="../99AL/DAL01013ZZZZZZZZZZZZ_L1.htm">AMAGA</option>
   <option value="../99AL/DAL01300ZZZZZZZZZZZZ_L1.htm">YONDO-CASABE</option>
   <option value="../99AL/DAL01301ZZZZZZZZZZZZ_L1.htm">ZARAGOZA</option>
</select>

根据之前关于 SO 的问题,例如这个 (Selenium - Python - drop-down menu option value),我首先尝试了使用 Selenium 处理下拉菜单的基本方法,即以下列方式使用其 Select 方法:

#Preamble to code
#Importing packages
import selenium
import time
from selenium import webdriver

url = https://elecciones.registraduria.gov.co:81/esc_elec_2015/99AL/DAL01004ZZZZZZZZZZZZ_L1.htm #Setting URL

driver = webdriver.Chrome()
driver.implicitly_wait(5)
driver.get(url)

time.sleep(20)


from selenium.webdriver.support.ui import Select

select = Select(driver.find_element_by_id('combo3')) #Selecting the drop-down menu by ID
select.select_by_value("../99AL/DAL01007ZZZZZZZZZZZZ_L1.htm") # Trying to select the option in drop-down menu by value. Error arises.

按值选择时出现ElementNotVisibleException 错误。因此,我尝试对 SO 上提供的其他解决方案进行一些故障排除(参见此处:Selecting a value from a drop-down option using selenium python),例如通过其 XPath 查找元素,然后单击它。这是我尝试过的代码:

driver.find_element_by_xpath("//select[@id='combo3']/option[@value='../99AL/DAL01007ZZZZZZZZZZZZ_L1.htm']").click()

这里又出现了ElementNotVisibleException。所以接下来,我尝试这里的建议(ElementNotVisibleException: Message: element not visible - Python3 Selenium),即实现一些等待时间并等待下拉菜单对应的元素变为可点击,使用以下代码:

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

element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//select[@id='combo3']")))
element.click()

我在这里收到TimeoutException。我之前使用 Chrome 的开发人员工具控制台检查是否有两个或多个元素与定位器匹配并且只有一个(长度:1)所以我认为其他原因可能导致超时但我无法找到什么有可能。

在尝试一些变通方法(例如此处建议的解决方法(Python selenium drop down menu click)时,通过实现EC.visibility_of_element_located 等其他方法时,我也会遇到 TimeoutException。下面是引发 TimeoutException 的代码:

element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//select[@id='combo3']")))
select = Select(element)

如您所见,我尝试了各种技术来尝试从 Municipio 下拉菜单中选择不同的选项,但仍然无法弄清楚。任何帮助或建议告诉我我错过了什么或做错了什么将不胜感激。提前致谢!

【问题讨论】:

    标签: python selenium web-scraping


    【解决方案1】:

    ID 为“combo3”的选择元素的样式为“display: none;”这使它对 Selenium 不可见。您可以使用 div ID 'combo3_chosen' 驱动元素并输入所需的结果。

    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    select_div = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='combo3_chosen']")))
    select_div.click()
    input = WebDriverWait(driver, 10).until(EC.visibility_of_any_elements_located((By.XPATH, "//input")))
    input[0].send_keys("Todos")
    input[0].send_keys(Keys.RETURN)
    

    在我的示例中,我单击 select_div,它会打开一个带有下拉菜单的输入。然后我输入“Todos”并按回车键加载“Todos”部分。

    我使用“visibility_of_any_elements_located”作为输入,因为页面上有多个隐藏的输入(其他选择)。如果我使用 'visibility_of_element_located' Selenium 会尝试返回第一个不可见的输入。 'visibility_of_any_elements_located' 将返回任何可见的输入。

    或者,您可以打开 select_div 并找到您想要的结果并单击该元素。

    【讨论】:

      猜你喜欢
      • 2018-02-17
      • 1970-01-01
      • 2015-05-15
      • 2015-08-14
      • 2021-04-02
      • 2023-03-25
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多