Python 使用Selenium通过下拉列表(md选择)

Python 使用Selenium通过下拉列表(md选择),python,selenium,Python,Selenium,我被一个我无法通过的下拉列表困住了。 我正在尝试使用Selenium从以下链接收集一些价格数据: . 在这个链接中,您需要单击一个按钮(下一步),然后在随后的下拉列表中选择任何选项,然后再次按(下一步)进入我想要收集一些信息的信息页面。我被困在下拉列表中-我无法选择任何选项 这是我迄今为止的代码: browser.get("https://xxx/#/pricePlans/step1") wait = WebDriverWait(browser, 10) while True: try:

我被一个我无法通过的下拉列表困住了。 我正在尝试使用Selenium从以下链接收集一些价格数据: . 在这个链接中,您需要单击一个按钮(下一步),然后在随后的下拉列表中选择任何选项,然后再次按(下一步)进入我想要收集一些信息的信息页面。我被困在下拉列表中-我无法选择任何选项

这是我迄今为止的代码:

browser.get("https://xxx/#/pricePlans/step1")
wait = WebDriverWait(browser, 10)
while True:
    try:        
        button = browser.find_element_by_css_selector('body > div.md-dialog-container.ng-scope > md-dialog > md-dialog-actions > div > button')
    except TimeoutException:
        break    
    button.click()
    options_box= browser.find_element_by_class_name('bullet-content-title')
    wait = WebDriverWait(browser, 5)
    options_box.click() 
问题在于下拉选项(它有HDB 1-room、HDB 2-room等选项)。我试图通过XPATH、CSS选择器、类名(如上所示)引用选项框,但在上面的代码片段中,Spyder发出超时。我尝试过的其他片段包括:

ui.WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, "bullet-content-title")))
使用XPATH,类名称,但没有运气。 我是一个网络抓取的新手,到目前为止,我一直在搜索SO,但是我找不到关于(md select)下拉列表的很多解决方案。 我还试图使用

ActionChains(driver).move_to_element(options_box).click(options_box)
但我没有看到任何点击或鼠标移动,所以我被难住了。 我非常感谢您在这个时候提出的任何建议。非常感谢你

编辑: 代码片段和响应:

from selenium import webdriver 
from selenium.webdriver.support import ui
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.action_chains import ActionChains
option = webdriver.ChromeOptions()
option.add_argument('--incognito')
browser = webdriver.Chrome(executable_path='C:\\ChromeDriver\\chromedriver.exe', options=option)
browser.get("https://xxx")

wait = WebDriverWait(browser, 10)

while True:
    try:        
        button = browser.find_element_by_css_selector('body > div.md-dialog-container.ng-scope > md-dialog > md-dialog-actions > div > button')
    except TimeoutException:
        break    
    button.click()


    options_box = browser.find_element_by_class_name('bullet-content-title')
    wait = WebDriverWait(browser, 5)
    options_box.click()
这将返回“StaleElementReferenceException:stale元素引用:元素未附加到页面文档” 我认为这是由于第二个“下一步”按钮的存在,该按钮目前处于惰性状态

options_box = ui.WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, "bullet-content-title")))  
options_box.click()
什么也不做。Spyder最终向我返回超时错误

driver.get('https://compare.openelectricitymarket.sg/#/pricePlans/step1')
time.sleep(5)  

next_btn = driver.find_element_by_css_selector('button.green-btn')  
next_btn.click()  

dropdown = driver.find_element_by_id('select_4')  
options = dropdown.find_elements_by_tag_name('md-option')  

for option in options:  
   print option.get_attribute('value')

希望这有帮助。使用.get_属性方法查找选项的值,如果与所需值匹配,请单击该选项。:)

@Andreway answer有助于获取值,但不适用于选择选项。您可以这样做来选择选项

#browser.get("https://......")
wait = WebDriverWait(browser, 10)

try:        
    browser.find_element_by_css_selector('button.green-btn').click()
    # wait until dialog dissapear
    wait.until(EC.invisibility_of_element_located((By.CSS_SELECTOR, 'md-dialog[aria-describedby="dialogContent_0"]')))
    # click the dropdown
    browser.find_element_by_css_selector('md-input-container').click()
    # select the option element
    setOptionElement = browser.find_element_by_css_selector('md-option[value="HDB Executive"]')
    # need to scrollIntoView if the option in the bottom
    # or you get error the element not clickable
    browser.execute_script('arguments[0].scrollIntoView();arguments[0].click()', setOptionElement)

except Exception as ex:
    print(ex)

添加了一个新答案,因为您无法在SO的“注释”部分设置代码的格式,所以,就这样吧!:)嗨,安德鲁,看起来不错!嗯,看看你的代码,看来我找到了错误的元素?看起来你找到了元素,但尝试单击下拉列表本身,但下拉列表的选项位于html中,但在单击之前是隐藏的,因此你只需单击后端的选项,它就会出现在下拉列表中。没有必要点击下拉列表本身。嗨,安德鲁,你知道如何选择下拉列表中的任何一个选项吗?当我使用以下插件时:选项中的选项:if option.get_attribute('value')='HDB 4-Room':option.click()我得到一个“ElementNotVisibleException:element not interactivatable”谢谢。对这适用于选择选项。也许我刚才的评论不太清楚,因为我很激动。谢谢@ewlink!