Python Selenium WebDriver卡在下拉列表中,未选择

2024-09-20 03:47:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python selenium Web驱动程序新手。 我被困在一个在html中有“onchange”参数的下拉列表中。 这是“检查”窗口的外观:

  • 我试图在名为“开始”的框中输入日期
  • 然后转到“学校”(学校1、学校2等)的下拉列表。 一旦我选择了学校,相邻的下拉列表(学校级别)将刷新/更新/填充该学校的学校级别(中学、高中、初等教育等)。此元素有一个“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(&#39;Template1_Control0_BottomPanel_StudentEditEnrollmentAdd_DatePickerStartDate&#39;, &#39;Template1_Control0_BottomPanel_StudentEditEnrollmentAdd_DatePickerStartDate&#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(&#39;__doPostBack(\&#39;Template1$Control0$BottomPanel$StudentEditEnrollmentAdd$BuildingDropDown\&#39;,\&#39;\&#39;)&#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(&#39;__doPostBack(\&#39;Template1$Control0$BottomPanel$StudentEditEnrollmentAdd$BuildingSchoolLevelDropDown\&#39;,\&#39;\&#39;)&#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")

我还尝试将_移动到_元素()。单击(执行(),但仍然不起作用

html中的onchange javascripts由于某些原因无法正确显示,因此我在下面附上它们:

//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)

再次感谢你


Tags: id列表bytimedriversleepelementfind
1条回答
网友
1楼 · 发布于 2024-09-20 03:47:42

据我所知,这正是你的问题:

After I enter the start date, it does move on the dropdown and clicks on it and all three schools get visible but the driver does not select the school and does not move on to the adjacent school level dropdown.

这意味着一旦onchange正确检测到日期,选择下拉列表或<select>输入时就会发生错误

我发现这在类似的案例中有效:

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进行选择通常更精确。试试看

相关问题 更多 >