C#Selenium学习(五)-事件

C#Selenium学习(五)-事件

上一节中主要纪录了录多窗口的处理,包括全屏、获取cookie、超时、切换窗口等。这一节主要纪录测试中添加的各种事件

1.Selenium的事件和Win32程序里事件的不同。

相同之处:都是在运行中满足特定条件后,击发相应的逻辑和设置。

不同之处:1.Win32程序:基本和上面相同之处一样,主要是在特定条件下击发的。 2.Selenium:是在进行到测试某一步时,进行动作或纪录属性。比如截图、获取前后的URL有、查找条件这些,主要在于运行顺序而不是击发条件。

Selenium中主要是用EventFiringWedDriver事件卅实现。他是将以前Win32程序的事件,放在这个对象中。如下图可以看到这些事件.
这里写图片描述

通过这些事件,可以在运行到特定步骤时击发这些逻辑。但是和win32编程不同的是,这里的事件需要自己手动先编写一个,然后挂接上去。如下图:
这里写图片描述

也可以这样写:

  eventDriver.Navigating += EventDriver_Navigating;

在+=后面直接按两次tab键,会自动生成一个事件。这里应该是C#的语法糖。

然后编写一个对应的事件,注意这里需要按EventHandler这种事件类型的格式编写:
这里写图片描述

要挂接的事件:

        /// <summary>
        /// 导航前发生的事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void NavigatingEvent(object sender, WebDriverNavigationEventArgs e )
        {
            Console.WriteLine($"即将要跳转到的URL为:{e.Driver.Url}");          
        }

截图功能发现只能截图浏览器的,而不是全屏

2.添加事件

首先是准备好要添加的事件,然后再挂接。这里可以使用C#的语法糖。在+=后面直接按两次tab键,然后再移动到事件区编辑。这里为了信息顺序不那么乱,使用了一个list集合来保存信息。在最后打印出来。如果是真实项目,可能需要考虑到互斥锁什么的。这里有一点不好的就是,这些事件的击发,必须要写好顺序,不然出错的话,不知道是那一个事件,也不知道出错在那里。

 //挂接事件
eventDriver.Navigating += EventDriver_Navigating;//导航前
eventDriver.Navigated += EventDriver_Navigated;//导航后
 eventDriver.FindingElement += EventDriver_FindingElement;//查找元素前
eventDriver.FindElementCompleted += EventDriver_FindElementCompleted;//查找元素后
eventDriver.ElementClicking += EventDriver_ElementClicking;//元素单击前
eventDriver.ElementClicked += EventDriver_ElementClicked;//元素单击后
eventDriver.ElementValueChanging += EventDriver_ElementValueChanging;//元素值改变前
eventDriver.ElementValueChanged += EventDriver_ElementValueChanged;//元素值改变后
eventDriver.ExceptionThrown += EventDriver_ExceptionThrown;//异常发生后事件
 #region 事件区

        /// <summary>
        /// 导航前发生的事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void EventDriver_Navigating( object sender , WebDriverNavigationEventArgs e )
        {
            this.listMeassage.Add( "-----------------------------------------" );
            this.listMeassage.Add( $"即将要跳转到的URL为:{e.Driver.Url}" );
        }

        /// <summary>
        /// 导航后发生的事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void EventDriver_Navigated( object sender , WebDriverNavigationEventArgs e )
        {
            this.listMeassage.Add( "-----------------------------------------" );
            this.listMeassage.Add( $"跳转到的URL为:{e.Driver.Url}" );


        }

        /// <summary>
        /// 查找元素前发生
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void EventDriver_FindingElement( object sender , FindElementEventArgs e )
        {
            this.listMeassage.Add( "-----------------------------------------" );

            this.listMeassage.Add( $"即将查找的元素为:{e.FindMethod.ToString( )}" );

        }

        /// <summary>
        /// 查找元素后发生
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void EventDriver_FindElementCompleted( object sender , FindElementEventArgs e )
        {
            this.listMeassage.Add( "-----------------------------------------" );
            this.listMeassage.Add( $"找到元素,条件为:{e.FindMethod.ToString( )}" );

        }


        /// <summary>
        /// 单击元素前发生
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void EventDriver_ElementClicking( object sender , WebElementEventArgs e )
        {
            this.listMeassage.Add( "-----------------------------------------" );
            this.listMeassage.Add( $"要单击的元素的value属性为:{e.Element.GetAttribute( "value" )}" );


        }

        /// <summary>
        /// 单击元素后发生
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void EventDriver_ElementClicked( object sender , WebElementEventArgs e )
        {
            System.Threading.Thread.Sleep( 3 * 1000 );//暂停3秒
            this.listMeassage.Add( "-----------------------------------------" );
            this.listMeassage.Add( $"单击元素后,现在的URL为:{e.Driver.Url}" );

        }

        /// <summary>
        /// 单击元素前发生
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void EventDriver_ElementValueChanging( object sender , WebElementEventArgs e )
        {
            this.listMeassage.Add( "-----------------------------------------" );
            this.listMeassage.Add( $"元素更改前的值为:{e.Element.GetAttribute( "value" )}" );

        }

        /// <summary>
        /// 单击元素后发生
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void EventDriver_ElementValueChanged( object sender , WebElementEventArgs e )
        {
            this.listMeassage.Add( "-----------------------------------------" );
            this.listMeassage.Add( $"元素更改后的值为:{e.Element.GetAttribute( "value" )}" );

        }

        /// <summary>
        /// 异常(保存截图到本地)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void EventDriver_ExceptionThrown( object sender , WebDriverExceptionEventArgs e )
        {

            //地址
            string strPath = $@"D:\Desktop\{DateTime.Now.ToString( "yyyy-MM-dd HH-mm-ss" )}.png";

            //保存截图          
            Screenshot screen = ( sender as EventFiringWebDriver ).GetScreenshot( );
            screen.SaveAsFile( strPath , System.Drawing.Imaging.ImageFormat.Png );

            //输出保存信息
            this.listMeassage.Add( "-----------------------------------------" );
            this.listMeassage.Add( $"发生异常,截图已保存到:{strPath}" );



        }

代码很简单,没什么说的。如果有不懂的请留言下面吧。

3.结束测试

结束测试有下面两种:
1.Close():关闭WedDriver对象所在的窗口;
2.Quit():关闭所有相关窗口;

第一个是关闭一个窗口,一个wedDriver对象是可以有多个窗口的(之前的窗口切换也是提到过),需要关闭时要保证当前激活的窗口。比如一个wedDriver对象里有好多个窗口,你要关闭第2个窗口,就要用SwitchTo().Window()方法切换到第2个窗口才能关闭,不能直接关闭第几个窗口的。

第二个就没什么说的了,就是关闭和这个webDriver对象所有相关的窗口。当然,一个脚本是可以有多个webDriver对象

下面代码的代码展示这了两个方法的用法和用途。
1.打开百度首页,单击“注册”超级链接。
2.在弹出的窗口(百度账户注册)中,调用Close()方法,关闭新弹出的页面
3.再一次点击“注册”超级链接,调用Quit()方法来结束测试。

           //准备测试对象
            IWebDriver selenium = new ChromeDriver( );

            //导航到百度首页
            selenium.Navigate( ).GoToUrl( "http://www.baidu.com" );

            //进行点击
            Console.WriteLine("-------------------");
            Console.WriteLine("进行点击");
            selenium.FindElement( By.LinkText( "登录" ) ).Click( );
            selenium.FindElement( By.LinkText( "立即注册" ) ).Click( );

            //获取窗口句柄
            IList<string> listHand = selenium.WindowHandles;

            //切换到注册窗口并关闭
            Console.WriteLine( "-------------------" );
            Console.WriteLine( "切换到注册窗口" );
            selenium.SwitchTo(  ).Window( listHand[ 1 ] );
            System.Threading.Thread.Sleep( 3 * 1000 );
            Console.WriteLine( "-------------------" );
            Console.WriteLine( "关闭注册窗口" );
            selenium.Close( );
            System.Threading.Thread.Sleep( 3 * 1000 );

            //切换到主窗口并结束测试
            Console.WriteLine( "-------------------" );
            Console.WriteLine( "切换到主窗口并结束测试" );
            selenium.SwitchTo( ).Window( listHand[ 0 ] );
            selenium.FindElement( By.LinkText( "立即注册" ) ).Click( );
            System.Threading.Thread.Sleep( 3 * 1000 );
            selenium.Quit( );

            Console.ReadLine( );

4.下一节

下一节主要是自动化框架测试的流程和框架等。在书上为第6章,估计理论比较多。但理论我觉得是一个相当重要的东西。前面都是学会如何使用这个工具,下面可能是为什么要用 怎么才能用好 花式用等等吧。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值