带有 Python 的 Selenium:如何单击 dojo 组合框值
Selenium with Python : how to click dojo combobox values
我正在使用 Selenium 浏览大量使用 JS 的网页,我需要能够与页面上的 dojo 组件进行交互。我正在查看的页面有一个带有组合框的 dojo dijit 表单,其中包含我所在大学的主题名称。我想公开并反复单击列表中的每个项目,以便在重定向时抓取该主题的课程名称。单击下拉箭头按钮时会显示列表项。
url 我正在自动化:http://sis.rutgers.edu/soc/#subjects?semester=12020&campus=NB,NK,CM&level=U,G
我正在检查下拉按钮的元素并复制 XPath。
dropdownButton = driver.find_element_by_xpath('//*[@id="widget_dijit_form_FilteringSelect_0"]/div[1]/input')
运行 这会产生:
NoSuchElementException: Message: no such element: Unable to locate
element:
{"method":"xpath","selector":"//*[@id="widget_dijit_form_FilteringSelect_0"]/div[1]/input"}
编辑:我取得了一些进展,结果是在调用 find_by_xpath 时元素尚未呈现。我在我的程序中添加了等待,现在 Selenium 能够找到并单击下拉按钮。
使用WebDriverWait
等待需要的元素条件。下拉菜单在页面上的任何操作中消失,这就是为什么要获取选项定位器,您可以执行以下操作之一:
- 所有选项在第一次展开后加载,这就是为什么您可以在 chrome 开发工具中按文本搜索选项元素并获取定位器
- 暂停并检查元素。
您可以google定位器的最佳实践, and here。
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
我正在使用 Selenium 浏览大量使用 JS 的网页,我需要能够与页面上的 dojo 组件进行交互。我正在查看的页面有一个带有组合框的 dojo dijit 表单,其中包含我所在大学的主题名称。我想公开并反复单击列表中的每个项目,以便在重定向时抓取该主题的课程名称。单击下拉箭头按钮时会显示列表项。
url 我正在自动化:http://sis.rutgers.edu/soc/#subjects?semester=12020&campus=NB,NK,CM&level=U,G
我正在检查下拉按钮的元素并复制 XPath。
dropdownButton = driver.find_element_by_xpath('//*[@id="widget_dijit_form_FilteringSelect_0"]/div[1]/input')
运行 这会产生:
NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="widget_dijit_form_FilteringSelect_0"]/div[1]/input"}
编辑:我取得了一些进展,结果是在调用 find_by_xpath 时元素尚未呈现。我在我的程序中添加了等待,现在 Selenium 能够找到并单击下拉按钮。
使用WebDriverWait
等待需要的元素条件。下拉菜单在页面上的任何操作中消失,这就是为什么要获取选项定位器,您可以执行以下操作之一:
- 所有选项在第一次展开后加载,这就是为什么您可以在 chrome 开发工具中按文本搜索选项元素并获取定位器
- 暂停并检查元素。
您可以google定位器的最佳实践,
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