一、什么场景需要我们可以使用Select模块
HTML中通过select标签生成的下拉框,就可以通过Select模块进行处理。
二、下拉框处理方法
- 基于Action Chains进行连贯操作,首先点击下拉框,然后移动到目标选中元素,最后再点击一次,代码量很大、复杂,不考虑代码量可以使用。
- 实际上Selenium给我们提供了处理select下拉框的模块(建议使用)
selenium.webdriver.support.select
三、select模块原理解析
select模块只支持HTML页面是通过select标签生成的。否则,直接失败抛出异常UnexpectedTagNameException。
普通的下拉框由两个标签组成,select标签与option标签,我们可以将select标签理解为下拉框的架子,option是里面每个参数,其中value则为option标签的一种属性。
如源码所示,select_by_value()函数,先通过css定位到目标option元素,然后再依次选中元素。其他函数原理类似。
class Select(object):
def __init__(self, webelement):
# 必须是select标签
if webelement.tag_name.lower() != "select":
raise UnexpectedTagNameException(
"Select only works on <select> elements, not on <%s>" %
webelement.tag_name)
def select_by_value(self, value):
# 使用css selector方式,option标签下的value属性,定位目标元素
css = "option[value =%s]" % self._escapeString(value)
opts = self._el.find_elements(By.CSS_SELECTOR, css)
matched = False
for opt in opts: # 循环获取到的option元素,使用_setSelected方法选中元素
self._setSelected(opt)
if not self.is_multiple:
return
matched = True
if not matched:
raise NoSuchElementException("Cannot locate option with value: %s" % value)
def _setSelected(self, option):
if not option.is_selected():
option.click()
四、select类中的函数列表
函数 | 解析 |
---|---|
options | 返回select元素所有的options |
all_selected_options | 返回select元素中所有已选中的选项 |
first_selected_option | 返回select元素中选中的第一个选项 |
select_by_index(index) | 通过索引定位,index索引是从“0”开始 |
select_by_value(value) | 通过value属性值定位 |
select_by_visible_text(text)t | 通过文本值定位,visible_text是在option标签中间的值,即显示在下拉框的值; |
deselect_all() | 取消全部的已选择项 |
deselect_by_index(index) | 取消已选中的索引项 |
deselect_by_value(value) | 取消已选中的value值 |
deselect_by_visible_text(text) | 取消已选中的文本值 |
五、举例
html如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>我是标题</title>
</head>
<body>
<!--select标签-->
<select name="city" size="5" multiple="multiple">
<option value="1" tabindex="1">北京</option>
<option value="2" tabindex="2" selected="selected">河南</option>
<option value="3" tabindex="3">河北</option>
<option value="4" tabindex="4">山东</option>
<option value="5" tabindex="5">上海</option>
</select>
</body>
</html>
from selenium import webdriver
from selenium.webdriver.support.select import Select
import time
driver = webdriver.Chrome(r"D:\browser\chromedriver\chromedriver.exe")
driver.get("http://localhost:63342/ui_test/select%E6%A0%87%E7%AD%BE.html")
driver.maximize_window()
ele = driver.find_element_by_name("city")
select = Select(ele)
select.select_by_value("3") # 选中"河北"
time.sleep(3)
select.select_by_index(0) # 选中"北京"
time.sleep(3)
select.deselect_by_value("3") # 取消选中"河北"
time.sleep(3)
select.deselect_by_index(0) # 取消选中"北京"
time.sleep(3)
driver.quit()