[Selenium With C#基础教程] Lesson-07 复选框

复选框也是Web页面常见的一种用户交互控件,可以允许用户一次选择多个选项。常见的多选按钮示例如下图所示:

7-1 复选框示例_c2i.jpg

HTML源码如下:

请选择你常用的交通出行方式:<br /><br />
    <input type="checkbox" name="metro" checked="checked" id="metro" />地铁
    <input type="checkbox" name="bus" id="bus" />公交
    <input type="checkbox" name="bike" id="bike" />自行车
    <input type="checkbox" name="walk" id="walk" />步行
    <input type="checkbox" name="driving" id="driving" />自驾

通过Name选中复选框

  driver.FindElement(By.Name("metro")).Click();

通过ID选中复选框

对于复选框的点击而言实际第一次点击将选中,再次点击将清除选中状态(针对第一次状态是未选中状态而言),下面将演示在测试脚本中如何确认复选框是否为选中状态。

   IWebElement metroCheckbox = driver.FindElement(By.Id("metro"));
   if (!metroCheckbox.Selected)
   {
       metroCheckbox.Click();
   }

通过连续调用FindElement方法选中复选框

针对要定位的复选框具有多个相同的属性时,我们可以使用XPath定位,也可以使用连续调用FindElement方法。HTML源码如下:

<div id="div1">
  <input type="checkbox" name="test" checked="checked" value="on" />复选框位于第一个div里面
</div>
<div id="div2">
  <input type="checkbox" name="test" checked="checked" value="on" />复选框位于第二个div里面
  </div>

定位的脚本代码如下所示:

 driver.FindElement(By.Id("div2")).FindElement(By.Name("test")).Click();

清除复选框选中状态

对于清除复选框的状态,我们只需要再次点击复选框即可,与单选按钮一样,不能使用Clear()方法。因为复选框的状态而言总共就两种状态,选中和未选中状态。

  IWebElement drivingCheckbox = driver.FindElement(By.Id("driving"));
  if (drivingCheckbox.Selected)
  {
      drivingCheckbox.Click();
  }
  else
  {
      drivingCheckbox.Click();
  }

断言复选框的状态

判断复选框的方法比较简单,只需要使用Assert类中的方法即可。

   IWebElement bikeCheckbox = driver.FindElement(By.Id("bike"));
   Assert.IsFalse(bikeCheckbox.Selected);
   bikeCheckbox.Click();
   Assert.IsTrue(bikeCheckbox.Selected);

使用用户自定义插件的筛选框,如iCheck

在Web页面中开发人员经常会使用一些插件自定义的控件,如下图即是采用iCheck插件的自定义复选框:


7-2 iCheck复选框_c2i.jpg

以下为HTML部分源码:

<ul class="list">
    <li>
      <div class="icheckbox_flat-red checked"><input tabindex="13" id="flat-checkbox-1" style="position: absolute; opacity: 0;" type="checkbox">
        <ins style="position: absolute; top: 0%; left: 0%; display: block; width: 100%; height: 100%; margin: 0px; padding: 0px; background: rgb(255, 255, 255) none repeat scroll 0% 0%; border: 0px none;
        opacity: 0;"></ins>
      </div>
       <label for="flat-checkbox-1" class="">Checkbox 1</label>
    </li>
    <li>
      <div class="icheckbox_flat-red checked"><input tabindex="14" id="flat-checkbox-2" checked="" style="position: absolute; opacity: 0;" type="checkbox">
        <ins style="position: absolute; top: 0%; left: 0%; display: block; width: 100%; height: 100%; margin: 0px; padding: 0px; background: rgb(255, 255, 255) none repeat scroll 0% 0%; border: 0px none; 
        opacity: 0;"></ins>
       </div>
     <label for="flat-checkbox-2" class="">Checkbox 2</label>
    </li>
</ul>

完整代码如下:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.IE;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Firefox;
using System.Collections.ObjectModel;
using System.Threading;
using System.Drawing;

namespace SeleniumDemo
{
    [TestClass]
    public class Lesson07
    {
        IWebDriver driver = null;
        [ClassInitialize]
        public static void TestInitialize(TestContext context)
        {
            Console.WriteLine("初始化TestInitialize");
        }
        [TestInitialize]
        public void TestInitialize()
        {
            driver = new ChromeDriver();
            Console.WriteLine("开始进行测试");
        }

        [TestMethod]
        public void TestCheckbox()
        {
            Console.WriteLine("调用测试方法");
            string url = "http://www.bootcss.com/p/icheck/";
            driver.Navigate().GoToUrl(url);
            driver.Manage().Window.Maximize();
            IWebElement checkBox1Ele = driver.FindElement(By.XPath("//ul[@class='list']/li[1]/div[contains(@class,'icheckbox_flat-red')]"));
            IWebElement checkBox2Ele = driver.FindElement(By.XPath("//ul[@class='list']/li[2]/div[contains(@class,'icheckbox_flat-red')]"));
            int position = checkBox1Ele.Location.Y;
            ((IJavaScriptExecutor)driver).ExecuteScript("$(window.scrollTo(0," + position + "));");
            checkBox1Ele.Click();
            checkBox2Ele.Click();
            Assert.IsTrue((driver.FindElement(By.XPath("//ul[@class='list']/li[1]/div[contains(@class,'icheckbox_flat-red')]/input"))).Selected);
            Assert.IsFalse((driver.FindElement(By.XPath("//ul[@class='list']/li[2]/div[contains(@class,'icheckbox_flat-red')]/input"))).Selected);
        }
        [TestCleanup]
        public void TestCleanup()
        {
            Console.WriteLine("结束测试");
            driver.Quit();
        }
        [ClassCleanup]
        public static void ClassCleanup()
        {
            Console.WriteLine("清理ClassCleanup");
        }
    }
}

在上面完整的代码中,点击Checkbox按钮和判断Checkbox的状态,所使使用的元素不一样,不知各位大神能否帮忙解释一下原因?其实不管是什么类型的Web控件,定位的基本方法都是Webdriver API提供的8种基本方法,在日常测试中灵活加以应用,可大大提高日常工作效率。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,526评论 25 709
  • 1、窗体 1、常用属性 (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体。 ...
    Moment__格调阅读 10,046评论 0 11
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,216评论 4 61
  • 今天又到礼拜六了,时间过的真快,马上就要期中考试了。早上9点半孩子跟同学开始写作业,他爸爸今天休息,我也偷了一个懒...
    三年五班刘吉康阅读 1,170评论 0 0
  • 《德米安:彷徨少年时》,赫尔曼·黑塞 观点由屁股决定:这仿佛是要讨论自由意志的存在与否了。不妨放下这个重担,从字面...
    K里姆森阅读 3,114评论 0 0