Селен с Python: как щелкнуть значения в выпадающем списке dojo - PullRequest
0 голосов
/ 21 января 2020

Я перемещаюсь по JS веб-странице с Selenium, и мне нужно иметь возможность взаимодействовать с компонентом dojo на странице. Страница, на которую я смотрю, имеет форму додзё диджит с комбинированным списком, в котором есть названия предметов для моего университета. Я хочу выставить и итеративно щелкнуть по каждому элементу в списке, чтобы очистить названия курса для этого предмета, когда он перенаправляет. Элементы списка открываются при нажатии кнопки со стрелкой раскрывающегося списка.

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: Сообщение: нет такого элемента: Невозможно найти элемент: {"method": "xpath", "selector": "/ / * [@ id = "widget_dijit_form_FilteringSelect_0"] / div [1] / input "}

enter image description here

enter image description here

РЕДАКТИРОВАТЬ: я добился определенного прогресса, оказалось, что элемент не отображался к моменту вызова find_by_xpath. Я добавил ожидание в свою программу, и теперь Selenium может найти и нажать кнопку «вниз».

1 Ответ

2 голосов
/ 21 января 2020

Используйте WebDriverWait для ожидания требуемых условий элемента. Раскрывающийся список исчезает при любом действии на странице, поэтому для получения локатора параметров можно выполнить одно из следующих действий:

  • все параметры, загруженные после первого раскрытия, поэтому вы можете искать элемент параметра по тексту в chrome dev tools и get locator
  • приостановите и осмотрите элемент.

Вы можете использовать лучшие практики 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
...