Selenium与Python:如何单击dojo组合框值

Selenium与Python:如何单击dojo组合框值,python,selenium,dojo,dijit.form,Python,Selenium,Dojo,Dijit.form,我正在使用Selenium浏览一个JS很重的网页,我需要能够与页面上的dojo组件交互。我正在查看的页面有一个dojo dijit表单和一个组合框,其中包含我所在大学的科目名称。我想公开并反复单击列表中的每一项,以便在该主题重定向时刮取该主题的课程名称。单击下拉箭头按钮时,将显示列表项 我正在自动处理的url: 我正在检查元素的下拉按钮并复制XPath dropdownButton = driver.find_element_by_xpath('//*[@id="widget_dijit_for

我正在使用Selenium浏览一个JS很重的网页,我需要能够与页面上的dojo组件交互。我正在查看的页面有一个dojo dijit表单和一个组合框,其中包含我所在大学的科目名称。我想公开并反复单击列表中的每一项,以便在该主题重定向时刮取该主题的课程名称。单击下拉箭头按钮时,将显示列表项

我正在自动处理的url:

我正在检查元素的下拉按钮并复制XPath

dropdownButton = driver.find_element_by_xpath('//*[@id="widget_dijit_form_FilteringSelect_0"]/div[1]/input')
运行此操作将产生:

NoSuchElementException:消息:没有这样的元素:无法定位 要素: {“方法”:“xpath”,“选择器”:“/*[@id=“widget\u dijit\u form\u FilteringSelect\u 0”]/div[1]/input”}


编辑:我已经取得了一些进展,结果是在调用find_by_xpath时元素还没有呈现出来。我在程序中添加了等待,现在Selenium可以找到并单击drowdown按钮

使用
WebDriverWait
等待所需的元素条件。在页面上的任何操作上,下拉列表都会消失,这就是为什么要获取选项定位器,您可以执行以下操作之一:

  • 第一次展开后加载的所有选项,这就是为什么您可以在chrome开发工具中按文本搜索选项元素并获取定位器
  • 暂停并检查元件
您可以在谷歌上搜索定位器的最佳实践,以及


使用
WebDriverWait
等待所需的元素条件。在页面上的任何操作上,下拉列表都会消失,这就是为什么要获取选项定位器,您可以执行以下操作之一:

  • 第一次展开后加载的所有选项,这就是为什么您可以在chrome开发工具中按文本搜索选项元素并获取定位器
  • 暂停并检查元件
您可以在谷歌上搜索定位器的最佳实践,以及


如果可能,请共享您的代码和url,或者以文本格式共享下拉列表和选项HTML?此元素的行为是什么?例如,如何“公开”下拉列表中的每个项目--是否单击主空框?此HTML屏幕截图与您的图像有何关联?很难判断HTML中的哪些元素与您发布的屏幕截图相匹配。发布原始HTML文本(不是屏幕截图)或链接到您正在自动化的页面会更有帮助。@Christine当按下下拉箭头按钮时,这些项目会显示出来。url已添加到问题中。@GregM,即…dojo dijit表单,带有一个组合框,其中包含我所在大学的科目名称…@GregM显示您迄今为止尝试过的内容以及您遇到的问题,我将帮助您或为您提供好的解决方案。如果可能,请共享您的代码和url,或文本格式的下拉列表和选项HTML?此元素的行为是什么?例如,如何“公开”下拉列表中的每个项目--是否单击主空框?此HTML屏幕截图与您的图像有何关联?很难判断HTML中的哪些元素与您发布的屏幕截图相匹配。发布原始HTML文本(不是屏幕截图)或链接到您正在自动化的页面会更有帮助。@Christine当按下下拉箭头按钮时,这些项目会显示出来。url已添加到问题中。@GregM,即…dojo dijit表单,带有一个组合框,其中包含我所在大学的科目名称…@GregM显示您到目前为止尝试过的内容以及您遇到的问题,我将帮助您或为您提供好的解决方案。
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)

with driver:
    driver.get("http://sis.rutgers.edu/soc/#subjects?semester=12020&campus=NB,NK,CM&level=U,G")
    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#filteringSelectDiv .dijitArrowButtonInner"))).click()
    options = driver.execute_script('return [...arguments[0]].map(e=>e.textContent)',
                                    wait.until(EC.presence_of_all_elements_located(
                                        (By.CSS_SELECTOR, ".dijitComboBoxMenuPopup .dijitMenuItem[item]"))))

    for option in options:
        driver.find_element_by_css_selector(".dijitInputInner").clear()
        driver.find_element_by_css_selector(".dijitInputInner").send_keys(option, Keys.TAB)
        wait.until(lambda d: d.execute_script("return document.readyState === 'complete'"))
        # collect data