【问题标题】:Unable to click a search drop down box无法单击搜索下拉框
【发布时间】:2019-02-11 08:57:12
【问题描述】:

我正在尝试等待搜索下拉框出现,然后使用以下 sn-p 代码在 https://amazon.com 上单击它。

search_dropdown_box = WebDriverWait(chrome_browser,30).until(EC.visibility_of_element_located((By.ID,"searchDropdownBox")))

尽管如此,但代码的 sn-p 似乎从来没有工作过,它总是以失败告终,并出现以下异常。

  File "C:/Users/DHIWAKAR-PC/PycharmProjects/AlationProject/assignment.py", line 18, in <module>
    search_dropdown_box = WebDriverWait(chrome_browser,10).until(EC.visibility_of_element_located((By.ID,"searchDropdownBox")))
  File "C:\Python34\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 

我使用预期条件的方式是否有问题,或者是否有更好的预期条件可以利用?

【问题讨论】:

    标签: python selenium


    【解决方案1】:

    您正试图等待一个不可见且不可点击的元素,直到点击All 下拉菜单。我的意思是,您尝试点击的定位器在点击All 下拉菜单后将变为可见或可点击,并且您在此处使用了错误的定位器。

    尝试使用//div[@id='nav-search-dropdown-card']/div作为xpath,这样可以识别All下拉按钮并可以点击。

    如果您想从下拉列表中选择选项,则需要在单击 All 下拉列表后使用 searchDropdownBox 作为 id。

    试试下面的代码:

    driver.get('https://www.amazon.com/')
    search_dropdown_box = WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.XPATH, "//div[@id='nav-search-dropdown-card']/div")))
    search_dropdown_box.click()
    

    如果您想在单击All 后从下拉列表中选择任何选项,则可以使用python 的Select,如下所示:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.select import Select
    
    driver = webdriver.Chrome('chromedriver path')
    driver.get('https://www.amazon.com/')
    search_dropdown_box = WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.XPATH, "//div[@id='nav-search-dropdown-card']/div")))
    search_dropdown_box.click()
    
    options = driver.find_element_by_id('searchDropdownBox')
    select = Select(options)
    select.select_by_visible_text('Baby')
    

    希望对你有帮助……

    【讨论】:

    • 无法更好地解释它:),所以 searchDropDownBox 基本上是下拉列表的标识符,默认情况下在页面加载时不可见?
    【解决方案2】:

    我觉得你可以试试element_to_be_clickable

    search_dropdown_box = WebDriverWait(chrome_browser,30).until(EC.element_to_be_clickable((By.ID,"searchDropdownBox")))
    

    https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions

    【讨论】:

    • 再次出现同样的异常 :(
    【解决方案3】:

    我在 Java 中遇到了同样的问题,使用 fluent wait 解决了这个问题。

    对于pyton,参考这个链接: Java's FluentWait in Python

    您需要在ignore_exceptions 列表中添加TimeoutException。

    【讨论】:

    • 我将异常添加到列表中,但它仍然设法引发该异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多