我陷入了一个无法通过Selenium的下拉菜单中。
我正在尝试通过此链接使用Selenium收集一些价格数据:
https://xxx。在此链接中,您需要单击一个按钮(下一步),然后在后续下拉菜单中选择任何选项,然后再次按(下一步)进入要收集一些信息的信息页面。我被下拉菜单卡住了-我无法选择任何选项。

到目前为止,这是我的代码:

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室,HDB 2室等选项)。我试图通过XPATH,CSS选择器,class_name(如上所示)引用选项框,但上面的代码段中,Spyder发出了超时问题。我尝试过的其他片段包括:

ui.WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, "bullet-content-title")))


使用XPATH,class_name但没有运气。
我是Web抓取的新手,到目前为止,他是通过搜索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最终向我返回了超时错误。

最佳答案

@AndrewRay答案很适合获取值,但不适用于选择选项。您可以执行此操作以选择选项。

#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)

关于python - 使用Selenium获取下拉列表(md-select),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54058410/

10-16 20:49