Python Selenium WebDriver застрял в выпадающем списке и не выбирается

#javascript #python #drop-down-menu #selenium-chromedriver #onchange

#javascript #python #выпадающее меню #selenium-chromedriver #onchange

Вопрос:

Я новичок в python selenium webdriver. Я застрял в раскрывающемся списке, в котором есть параметр «onchange» в html. Вот как выглядит окно проверки:

  • Я пытаюсь сначала ввести дату в поле с именем «Начать»
  • Затем перейдите к выпадающему списку для «Школ» (School1, School2 и т.д.). Как только я выберу школу, соседний выпадающий список (уровни школы) обновит / обновит / заполнит уровни школы (средний, высокий, elem и т. Д.) Для этой школы. Для этого элемента есть «onchange =».
  • Затем перейдите к раскрывающемуся списку школьных уровней, чтобы выбрать уровень. Для этого элемента также есть «onchange =»
  • А затем перейдите к раскрывающемуся списку уровня оценки.

Я застрял в первом выпадающем списке.После того, как я ввожу дату начала, он переходит в раскрывающийся список и нажимает на него, и все три школы становятся видимыми, но драйвер не выбирает школу и не переходит к выпадающему списку уровня соседней школы.

Насколько я понимаю из того, что я нашел в Интернете, это, скорее всего, связано с событием onchange javascript, но не смог понять, как запустить событие.

Пожалуйста, помогите. Заранее благодарю вас.

Это html-блок для поля даты начала:

 <div class="inline-block" ><input name="Template1$Control0$BottomPanel$StudentEditEnrollmentAdd$DatePickerStartDate" type="text" size="9" id="Template1_Control0_BottomPanel_StudentEditEnrollmentAdd_DatePickerStartDate" spellcheck="false" style="BACKGROUND:#ff9999;display:inline;" /><input type="image" name="Template1$Control0$BottomPanel$StudentEditEnrollmentAdd$DatePickerStartDate_IB" id="Template1_Control0_BottomPanel_StudentEditEnrollmentAdd_DatePickerStartDate_IB" src="Images/Mindex/WebControls/DatePicker/calendar.jpg" onclick="PopupCal(amp;#39;Template1_Control0_BottomPanel_StudentEditEnrollmentAdd_DatePickerStartDateamp;#39;, amp;#39;Template1_Control0_BottomPanel_StudentEditEnrollmentAdd_DatePickerStartDateamp;#39;,false,false); return false;" style="border-width:0px;display:inline;vertical-align:middle;" /></div></nobr>
  

И это html-блок для двух соседних выпадающих списков:

 <select name="Template1$Control0$BottomPanel$StudentEditEnrollmentAdd$BuildingDropDown" onchange="javascript:setTimeout(amp;#39;__doPostBack(amp;#39;Template1$Control0$BottomPanel$StudentEditEnrollmentAdd$BuildingDropDownamp;#39;,amp;#39;amp;#39;)amp;#39;, 0)" id="Template1_Control0_BottomPanel_StudentEditEnrollmentAdd_BuildingDropDown">
                                            <option selected="selected" value="3">School1</option>
                                            <option value="4">School2</option>
                                            <option value="5">School3</option>

                                        </select>
<select name="Template1$Control0$BottomPanel$StudentEditEnrollmentAdd$BuildingSchoolLevelDropDown" onchange="javascript:setTimeout(amp;#39;__doPostBack(amp;#39;Template1$Control0$BottomPanel$StudentEditEnrollmentAdd$BuildingSchoolLevelDropDownamp;#39;,amp;#39;amp;#39;)amp;#39;, 0)" id="Template1_Control0_BottomPanel_StudentEditEnrollmentAdd_BuildingSchoolLevelDropDown">
                                                <option selected="selected" value="4">K-8</option>
                                                <option value="5">High School</option>
                                                <option value="6">Summer School</option>
                                                <option value="7">Middle School</option>
                                                <option value="8">Elementary</option>
    
                                            </select></nobr>
  

И это мой код:

 print("Clicking on student selector icon")
driver.find_element_by_xpath("/html/body/form/div[4]/div[1]/div/div[2]/div/table/tbody/tr/td/table[2]/tbody/tr[" str(r) "]/td[1]/input").click()
time.sleep(2)
tab_student = driver.find_element_by_id("Template1_Control0_TabHeaderDetails_MenuTabs1_MenuTabStudent")#we can move this to the start of the script
tab_student.click()
time.sleep(3)


icon_add_enrollment = driver.find_element_by_id("Template1_Control0_BottomPanel_IconButtonAdd")#we can move this to the start of the script
icon_add_enrollment.click()
time.sleep(3)

input_startdate = driver.find_element_by_id("Template1_Control0_BottomPanel_StudentEditEnrollmentAdd_DatePickerStartDate")
input_startdate.send_keys("4/21/2010")
time.sleep(2)
print("Start Date entered")


dropdown_school = driver.find_element_by_id("Template1_Control0_BottomPanel_StudentEditEnrollmentAdd_BuildingDropDown")
dropdown_school.select_by_visible_text("School1")

time.sleep(5)
print("School picked")
time.sleep(6)

dropdown_level = driver.find_element_by_id("Template1_Control0_BottomPanel_StudentEditEnrollmentAdd_BuildingSchoolLevelDropDown")
dropdown_level.select_by_visible_text("Elementary")

#or maybe I can use this?  actions.move_to_element(dropdown_building).click().perform()

time.sleep(2)

print("Building picked")
time.sleep(6)

dropdown_grade = driver.find_element_by_id("Template1_Control0_BottomPanel_StudentEditEnrollmentAdd_GradeDropDown")
actions.move_to_element(dropdown_grade).click().perform()
time.sleep(2)
dropdown_grade.select_by_visible_text("1").click()
print("Grade picked")
time.sleep(2)

dropdown_ethnicity = driver.find_element_by_id("Template1_Control0_BottomPanel_StudentEditEnrollmentAdd_ddlEthnicity")
actions.move_to_element(dropdown_ethnicity).click().perform()
time.sleep(2)
dropdown_ethnicity.select_by_visible_text("White").click()
print("Ethnicity picked")
time.sleep(2)

icon_save_enrollment = driver.find_element_by_id("Template1_Control0_BottomPanel_StudentEditEnrollmentAdd_IconButtonAdd")#we can move this to the start of the script
icon_save_enrollment.click()

time.sleep(4)

print("Enrollment added.. Moving on to enrolling the next child")
  

Я также пробовал move_to_element().click(выполнить (), но все еще не работает.

По какой-то причине javascripts onchange в html отображаются некорректно, поэтому я прилагаю их ниже:

 //for school dropdown:

javascript:setTimeout('__doPostBack('Template1$Control0$BottomPanel$StudentEditEnrollmentAdd$BuildingDropDown','')', 0)


//for school levels dropdown:

javascript:setTimeout('__doPostBack('Template1$Control0$BottomPanel$StudentEditEnrollmentAdd$BuildingSchoolLevelDropDown','')', 0)  

Еще раз спасибо.

Ответ №1:

Насколько я понимаю, это ваша точная проблема:

После того, как я ввожу дату начала, он переходит в раскрывающийся список и нажимает на него, и все три школы становятся видимыми, но драйвер не выбирает школу и не переходит к выпадающему списку уровня соседней школы.

Это означает, что ошибка возникает при выборе выпадающих списков или <select> входных данных, как только дата будет правильно определена onchange.

Я обнаружил, что это работает в подобных случаях:

 schoolSelector = Select(driver.find_element_by_xpath('//select[@name="Template1$Control0$BottomPanel$StudentEditEnrollmentAdd$BuildingSchoolLevelDropDown"]'))
schoolOptions = schoolSelector.options
  

затем, если вы хотите перебрать каждую школу, которую вы можете использовать schoolOptions для получения каждой из них с:

 for school in range(0,len(schoolOptions)):
    schoolSelector.select_by_index(school)
  

Редактировать:
Не заметил, что вы опубликовали весь свой код, я думаю, что выбор по индексу и через XPATH обычно более точен. Попробуйте.

Комментарии:

1. Уважаемый @Пэт Мосс, спасибо за быструю помощь. Я просто попробовал индекс, и это не помогло. xpath не будет работать, потому что вы не можете выбрать с помощью xpath. Если вы имеете в виду поиск элемента по xpath, это не нужно, потому что я уже могу попасть в раскрывающийся список. Проблема в том, что, как только я попадаю на него, он расширяется и показывает все три доступных варианта с выделенным первым, но он не будет продолжать и выбирать этот первый вариант (или второй или третий) в качестве ввода / значения. Он просто остается там. Расширенное выпадающее меню также застряло. Он не исчезнет / не свернется.