selenium处理select标签的下拉框

发表于:2018-7-27 16:15

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:虫师    来源:博客园

  有时候我们会碰到<select></select>标签的下拉框。直接点击下拉框中的选项不一定可行。Selenium专门提供了Select类来处理下拉框。
  <select id="status" class="form-control valid" onchange="" name="status">
  <option value=""></option>
  <option value="0">未审核</option>
  <option value="1">初审通过</option>
  <option value="2">复审通过</option>
  <option value="3">审核不通过</option>
   </select>
  Python
  先以python为例,查看Selenium代码select.py文件的实现:
  ...\selenium\webdriver\support\select.py
  class Select:
  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"
  查看Select类的实现需要一个元素的定位。并且Example中给了例句。
  Select(driver.find_element_by_tag_name("select")).select_by_index(2)
  def select_by_index(self, index):
  """Select the option at the given index. This is done by examing the "index" attribute of an
  element, and not merely by counting.
  :Args:
  - index - The option at this index will be selected
  """
  match = str(index)
  matched = False
  for opt in self.options:
  if opt.get_attribute("index") == match:
  self._setSelected(opt)
  if not self.is_multiple:
  return
  matched = True
  if not matched:
  raise NoSuchElementException("Could not locate element with index %d" % index)
  继续查看select_by_index() 方法的使用并符合上面的给出的下拉框的要求,因为它要求下拉框的选项必须要有index属性,例如index=”1”。
  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
  """
  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)
  继续查看select_by_value() 方法符合我们的需求,它用于选取<option>标签的value值。最终,可以通过下面有实现选择下拉框的选项。
  from selenium.webdriver.support.select import Select
  ……
  sel = driver.find_element_by_xpath("//select[@id='status']")
  Select(sel).select_by_value('0')  #未审核
  Select(sel).select_by_value('1')  #初审通过
  Select(sel).select_by_value('2')  #复审通过
  Select(sel).select_by_value('3')  #审核不通过
  Java
  当然,在java中的用法也类似,唯一不区别在语法层面有。
  package com.jase.base;
  import org.openqa.selenium.WebDriver;
  import org.openqa.selenium.By.ById;
  import org.openqa.selenium.chrome.ChromeDriver;
  import org.openqa.selenium.support.ui.Select;
  public class SelectTest {
  public static void main(String[] args){
  WebDriver driver = new  ChromeDriver();
  driver.get("http://www.you_url.com");
  // ……
  Select sel = new Select(driver.findElement(ById.xpath("//select[@id='status']")));
  sel.selectByValue("0"); //未审核
  sel.selectByValue("1"); //初审通过
  sel.selectByValue("2"); //复审通过
  sel.selectByValue("3"); //审核不通过
  }
  }
   上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号