在項目測試中遇到了下拉框選擇的控件,來總結下如何使用select選擇下拉框:
下圖是Select類的初始化描述,意思是,給定元素是得是select類型,不是就拋異常。接下來給了例子:要操作這個select,先要定位到,然后再通過select_by_index 選擇下拉框
def __init__(self, webelement):
"""
Constructor. A check is made that the given element is, indeed, a SELECT tag. If it is not,
then an UnexpectedTagNameException is thrown.
:Args:
- webelement - element SELECT element to wrap
Example:
from selenium.webdriver.support.ui import Select \n
Select(driver.find_element_by_tag_name("select")).select_by_index(2)
"""
if webelement.tag_name.lower() != "select":
raise UnexpectedTagNameException(
"Select only works on <select> elements, not on <%s>" %
webelement.tag_name)
self._el = webelement
multi = self._el.get_attribute("multiple")
self.is_multiple = multi and multi != "false"
1、select_by_value:
看下代碼:
def select_by_value(self, value):
"""Select all options that have a value matching the argument. That is, when given "foo" this
would select an option like:
<option value="foo">Bar</option>
:Args:
- value - The value to match against
throws NoSuchElementException If there is no option with specisied value in SELECT
"""
css = "option[value =%s]" % self._escapeString(value)
opts = self._el.find_elements(By.CSS_SELECTOR, css)
matched = False
for opt in opts:
self._setSelected(opt)
if not self.is_multiple:
return
matched = True
if not matched:
raise NoSuchElementException("Cannot locate option with value: %s" % value)
就是說使用這個方法,下拉框屬性需要有value,如果選項中不具有指定值的項,就拋異常。例如:

2、select_by_index
看下代碼:
1 def select_by_index(self, index): 2 """Select the option at the given index. This is done by examing the "index" attribute of an 3 element, and not merely by counting. 4 5 :Args: 6 - index - The option at this index will be selected 7 8 throws NoSuchElementException If there is no option with specisied index in SELECT 9 """ 10 match = str(index) 11 for opt in self.options: 12 if opt.get_attribute("index") == match: 13 self._setSelected(opt) 14 return 15 raise NoSuchElementException("Could not locate element with index %d" % index)
這個是通過元素的“index”屬性來完成
3、select_by_visible_text
看下代碼:
1 def select_by_visible_text(self, text): 2 """Select all options that display text matching the argument. That is, when given "Bar" this 3 would select an option like: 4 5 <option value="foo">Bar</option> 6 7 :Args: 8 - text - The visible text to match against 9 10 throws NoSuchElementException If there is no option with specisied text in SELECT 11 """ 12 xpath = ".//option[normalize-space(.) = %s]" % self._escapeString(text) 13 opts = self._el.find_elements(By.XPATH, xpath) 14 matched = False 15 for opt in opts: 16 self._setSelected(opt) 17 if not self.is_multiple: 18 return 19 matched = True 20 21 if len(opts) == 0 and " " in text: 22 subStringWithoutSpace = self._get_longest_token(text) 23 if subStringWithoutSpace == "": 24 candidates = self.options 25 else: 26 xpath = ".//option[contains(.,%s)]" % self._escapeString(subStringWithoutSpace) 27 candidates = self._el.find_elements(By.XPATH, xpath) 28 for candidate in candidates: 29 if text == candidate.text: 30 self._setSelected(candidate) 31 if not self.is_multiple: 32 return 33 matched = True 34 35 if not matched: 36 raise NoSuchElementException("Could not locate element with visible text: %s" % text)
通過選擇文本來匹配,然后給出了例子。看下我的例子:

我的代碼:
1 stafftype_loc = (By.XPATH, "//select[@ng-model='Invite.type']") 2 3 find_element(*self.stafftype_loc).send_keys(stftype)