如何使用Selenium选择动态ID和Name的下拉框选项
问题
需要点击网页中的出生日期下拉框并选择指定选项,但每次加载页面时下拉框的id和name是随机值,无法通过这两个属性定位。网页HTML结构如下:
<span class="float-left d-sm-flex align-items-sm-center" style="width: 100%;font-size: 13px;line-height: 20px;color: #6b747d;height: 20px;">* Date of birth:</span> <p></p> <select class="border rounded-0 form-control form-control-sm" type="text" name="xrbzm" required="" style="font-size: 12px;height: 2%;margin-bottom: 2%;width: 25%!important;float:left;" id="xrbzm1"> <option value="" disabled="" selected="">Day</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> </select> <select class="border rounded-0 form-control form-control-sm" type="text" name="tzkrv" required="" style="font-size: 12px;height: 2%;margin-bottom: 2%;width: 45%!important;float:left;" id="tzkrv1"> <option value="" disabled="" selected="">Month</option> <option value="01">January</option> <option value="02">February</option> <option value="03">March</option> <option value="04">April</option> <option value="05">May</option> <option value="06">June</option> <option value="07">July</option> <option value="08">August</option> <option value="09">Septmeber</option> <option value="10">October</option> <option value="11">November</option> <option value="12">Dicember</option> </select> <select class="border rounded-0 form-control form-control-sm" type="text" name="eawfb" required="" style="font-size: 12px;height: 2%;margin-bottom: 2%;width: 30%!important;float:left;" id="eawfb1"> <option value="" disabled="" selected="">Year</option> <option value="2005">2005</option> <option value="2004">2004</option> <option value="2003">2003</option> <option value="2002">2002</option> <option value="2001">2001</option> <option value="2000">2000</option> <option value="1999">1999</option> <option value="1998">1998</option> </select>
尝试的代码无效:
day = 6 month = 'May' Year = 1999 driver.find_elements_by_xpath("//*[@class='border rounded-0 form-control form-control-sm']").click() driver.find_element_by_xpath("/option[text()='"+str(day)+"']").click() driver.find_element_by_xpath("//input[@placeholder='day']").click()
求不使用ID或NAME选择器的解决方案。
解决方案
针对原生<select>下拉框,推荐使用Selenium内置的Select类来操作,比直接点击更稳定。以下是可行的定位和操作方式:
1. 定位下拉框的核心思路
因为三个下拉框的类名相同,需要通过上下文特征区分:
- 第一个下拉框(Day):紧邻“Date of birth”文本的
<span>之后 - 第二个下拉框(Month):默认选项文本为“Month”
- 第三个下拉框(Year):默认选项文本为“Year”
2. 完整代码示例
from selenium.webdriver.support.ui import Select from selenium.webdriver.common.by import By day = 6 month = 'May' year = 1999 # 定位Day下拉框:通过相邻的Date of birth文本定位 day_select = Select(driver.find_element(By.XPATH, "//span[contains(text(), 'Date of birth')]/following-sibling::p/following-sibling::select[1]")) day_select.select_by_visible_text(str(day)) # 定位Month下拉框:通过默认选项的文本定位 month_select = Select(driver.find_element(By.XPATH, "//select[./option[text()='Month']]")) month_select.select_by_visible_text(month) # 定位Year下拉框:通过默认选项的文本定位 year_select = Select(driver.find_element(By.XPATH, "//select[./option[text()='Year']]")) year_select.select_by_visible_text(str(year))
3. 原代码的问题说明
find_elements_by_xpath返回元素列表,不能直接调用.click(),需取对应索引的元素/option[text()='6']的XPath路径错误,缺少父级节点,正确写法为//select/option[text()='6']- 页面中不存在
placeholder='day'的<input>元素,最后一行代码无效
内容的提问来源于stack exchange,提问作者Fabix
相关产品推荐
相关产品推荐

