【问题标题】:Select the second element of a dropdown list with Chrome Webdriver - Python使用 Chrome Webdriver - Python 选择下拉列表的第二个元素
【发布时间】:2021-08-14 03:35:46
【问题描述】:

我想使用 Chrome webdriver 在以下网站中选择“TIPOPARTICIPANTE”下拉列表的第二个元素:

https://www.rad.cvm.gov.br/ENET/frmConsultaExternaCVM.aspx

我可以通过以下方式选择下拉列表:

from selenium import webdriver
driver = webdriver.Chrome('D:\\chromeDriver\\chromedriver.exe') # caminho onde o chromedriver.exe está
driver.get('https://www.rad.cvm.gov.br/ENET/frmConsultaExternaCVM.aspx')

dropdown_list = driver.find_element_by_css_selector('#s2id_cboTipoParticipante')
dropdown_list.click()

option = driver.find_element_by_css_selector('li:nth-child(2)') 
option.click() # este comando gerou um erro 'ElementClickInterceptException'

但是,在这个脚本的最后一行,我得到了以下错误:

Traceback(最近一次调用最后一次): 文件“”,第 5 行,在 option2.click() 文件“C:\Users\Raphael\Anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py”, 第 80 行,点击 self._execute(Command.CLICK_ELEMENT) 文件“C:\Users\Raphael\Anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py”, 第 633 行,在 _execute return self._parent.execute(命令,参数) 文件“C:\Users\Raphael\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py”, 第 321 行,在执行中 self.error_handler.check_response(响应) 文件“C:\Users\Raphael\Anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py”, 第 242 行,在 check_response 中 raise exception_class(message, screen, stacktrace) ElementClickInterceptedException:元素点击拦截:元素 li class="select2-search-field".../li 在点不可点击 (819, 118)。其他元素会收到点击:div id="select2-drop-mask" class="select2-drop-mask" style=""/div (会话信息:chrome=90.0.4430.93)

有人可以帮我选择这个下拉列表的第二个元素(“Companhias Abertas”)吗?

【问题讨论】:

  • 问题解决了吗?

标签: python css selenium selenium-webdriver drop-down-menu


【解决方案1】:

1 在代码中使用显式等待: 对于此导入:

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

2 等待加载程序消失。为此使用:invisibility_of_element_located 方法。

第二个选项的 3 定位器是 #select2-drop li:nth-child(3) div,而不是 li:nth-child(2)。您指定的定位器有六个元素。

定位器说明:

#select2-drop - id为select2-drop的父类

li:nth-child(3) div 第三个孩子,因为第一个是nth-child(3)。 div - 你需要一个 li 的孩子。

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

driver = webdriver.Chrome(executable_path='/snap/bin/chromium.chromedriver')
driver.get('https://www.rad.cvm.gov.br/ENET/frmConsultaExternaCVM.aspx')
wait = WebDriverWait(driver, 15)
wait.until(EC.invisibility_of_element_located((By.CSS_SELECTOR, "div[id=divSplash]")))
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#s2id_cboTipoParticipante"))).click()
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#select2-drop li:nth-child(3) div"))).click()

结果: 下拉选择

【讨论】:

  • wait.until(EC.element_to_be_clickable()) 返回等待的元素,因此该行可以是 wait.until(EC.element_to_be_clickable()).click() 而不是两行。第二次等待和click() 相同。如果您使用 XPath 作为下拉菜单中的选项以通过包含的文本单击它会更好。您永远不知道下拉列表中的项目何时会更改或重新排序,因此今天选择 3 可能是正确的选项,但下周它可能不正确,并且当脚本后面的某些事情没有按计划进行时,将很难调试。
  • 该选项可以使用 XPath //div[text()='Companhia Aberta'] 定位。
  • @JeffC 我同意通过文本定位是更好的选择。
  • @JeffC,感谢您提供的优雅解决方案。
  • 另外,从你的回答中学到了很多,@vitaliis
【解决方案2】:

尝试像这样定义option

option = driver.find_elements_by_css_selector('span.select2-match')[2]

【讨论】:

  • 你试过这个代码吗?它不适合我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 2017-12-17
  • 2018-09-21
  • 1970-01-01
相关资源
最近更新 更多