C# Selenium学习(四)-Cookie和窗口处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hjkl950217/article/details/54671010

C#Selenium学习(四)

上一节中主要纪录了怎么从页面上获取信息和对话框的处理。这一节主要纪录多窗口的处理。多标签或多个浏览器窗口都包括在里面。主要测试多个窗口之间的切换

1.获得窗口标识WindowHandles

要在不同的浏览器之间切换,必须获得不同的窗口(标签)的标识符。用一个集合来保存这些数据。当需要到新窗口里进行操作时,需要将测试器前往新的窗口。开始创建的测试器是对窗口来的,所以当我们需要切换窗口时。需要调用 测试器.SwitchTo().window(获得标识) 这个方法来返回一个新的测试器对象。新的对象是代表的是切换的窗口。代码如下:

public void 显示所有窗口的标示( )
        {
            IWebDriver selenuim = new ChromeDriver( );//谷歌浏览器
            selenuim.Navigate( ).GoToUrl( "http://tieba.baidu.com/f/search/adv" );

            //找到注册元素
            IWebElement register = selenuim.FindElement( By.XPath( @".//*[@id='com_userbar']/ul/li[5]/div/a" ) );
            register.Click( );

            //显示所有标识
            IList<string> listHand = selenuim.WindowHandles;//拿到所有标识
            Console.WriteLine();
            Console.WriteLine( );
            Console.WriteLine( );
            foreach( string item in listHand )
            {
                Console.WriteLine(item);
            }

            /*这里一会插入代码*/

            Console.ReadKey( );
            selenuim.Quit( );

        }

效果如下:
这里写图片描述

将测试器改为火狐后,效果如下:
这里写图片描述

可见各浏览器的标识符是不一样的。

下面切换到新打开的窗口后,输入一个12345来表示我们成功了
在上面的代码基础下 添加下面代码

            //切换到注册窗口再输入12345
            selenuim.SwitchTo( ).Window( listHand[ 1 ] );
            selenuim.FindElement( By.Name( "userName" ) ).SendKeys("12345");

结果如图:
这里写图片描述

2.测试设置管理

这里主要说的是Cookie、超时时间等设置。用Options对象进行管理。

2.1Cookies

在C#中,通过Cookies属性来获取当前的Cookie集合,然后进行增删改查操作。

Cookie由5个部分组成:名称、值、所在域、路径和过期时间。

下面我们进入百度首页,然后获取cookie,并让它变动一下来看到效果。 代码如下:

            IWebDriver selenuim = new ChromeDriver( );
            selenuim.Navigate( ).GoToUrl( "http://www.baidu.com" );


            //获取Cookie
             ICookieJar listCookie = selenuim.Manage( ).Cookies;
            // IList<Cookie> listCookie = selenuim.Manage( ).Cookies.AllCookies;//只是显示 可以用Ilist对象
            //显示初始Cookie的内容
            Console.WriteLine("--------------------");
            Console.WriteLine($"当前Cookie集合的数量:\t{listCookie.AllCookies.Count}");
            for( int i = 0 ; i < listCookie.AllCookies.Count ; i++ )
            {

                Console.WriteLine( $"Cookie的名称:{listCookie.AllCookies[i].Name}" );
                Console.WriteLine( $"Cookie的值:{listCookie.AllCookies[ i ].Value}" );
                Console.WriteLine( $"Cookie的所在域:{listCookie.AllCookies[ i ].Domain}" );
                Console.WriteLine( $"Cookie的路径:{listCookie.AllCookies[ i ].Path}" );
                Console.WriteLine( $"Cookie的过期时间:{listCookie.AllCookies[ i ].Expiry}" );
                Console.WriteLine( "-----" );
            }


            //添加一个新的Cookie
            Cookie newCookie = new Cookie( "新Cookie" , "新值" , ""  , DateTime.Now.AddDays( 1 ) );

            listCookie.AddCookie( newCookie );
            Console.WriteLine( "--------------------" );
            Console.WriteLine( $"当前Cookie集合的数量:\t{listCookie.AllCookies.Count}" );
            for( int i = 0 ; i < listCookie.AllCookies.Count ; i++ )
            {

                Console.WriteLine( $"Cookie的名称:{listCookie.AllCookies[ i ].Name}" );
                Console.WriteLine( $"Cookie的值:{listCookie.AllCookies[ i ].Value}" );
                Console.WriteLine( $"Cookie的所在域:{listCookie.AllCookies[ i ].Domain}" );
                Console.WriteLine( $"Cookie的路径:{listCookie.AllCookies[ i ].Path}" );
                Console.WriteLine( $"Cookie的过期时间:{listCookie.AllCookies[ i ].Expiry}" );
                Console.WriteLine( "-----" );
            }

            //删除这个Cookie并再次显示总数
            listCookie.DeleteCookieNamed( newCookie.Name );

            Console.WriteLine( $"当前Cookie集合的数量:\t{listCookie.AllCookies.Count}" );


            Console.ReadLine( );
            selenuim.Quit( );

运行效果如下:
这里写图片描述
这里写图片描述

这里需要说明一点的就是,这里新添加的Cookie第三个参数需要为”“,原因我也不是太懂。但是在对比其它获取到的Cookie后发现,其它的Cookie的路径也是为空的。具体Cookie是什么东西,怎么用,本人也不是太懂。

同时这里还发现,AllCookies是一个只读集合,用Ilist来获取的话,只显示什么问题,但是要添加或删除就行了,会提示这是一个只读集合。我推测这里,AllCookies只是用来显示数据的属性,如果要添加或删除时,调用的是ICookieJar对象下的方法,不是AllCookies属性下面的方法。

还有一点就是在添加Cookie后,马上删除时并打印集合总数时,发现数量还是不变的。我在删除后要显示那里打一个断点再运行后发现数量是少1的。这里推测删除用的是一个异步的方法,在删除方法还没有真的生效前我就打印了数据,所以没有变。为了验证,我在删除和打印之间加了一个休眠1秒,发现数据变了。

2.2Window

这个属性是可以对当前的窗口进行简单的控制。如获取坐标和大小,还可以将其最大化。下面我们用过示例代码来试试效果。
下面的代码是先打开网页,打印坐标和大小,再控制它最大化,再次打印坐标和大小。

            //打开网页
            IWebDriver selenium = new ChromeDriver( );
            selenium.Navigate( ).GoToUrl( "www.baidu.com" );

            //打印现在的坐标和大小
            IWindow window = selenium.Manage( ).Window;
            Console.WriteLine("第一次打印");
            Console.WriteLine($"坐标X为{window.Position.X}\tY为{window.Position.Y}");
            Console.WriteLine($"大小长为{window.Size.Width}\t宽为{window.Size.Height}");
            Console.WriteLine("-------------");

            //控制最大化
            window.Maximize( );

            //再次打印数据
            Console.WriteLine( "第二次打印" );
            Console.WriteLine( $"坐标X为{window.Position.X}\tY为{window.Position.Y}" );
            Console.WriteLine( $"大小长为{window.Size.Width}\t宽为{window.Size.Height}" );
            Console.WriteLine( "-------------" );


            Console.ReadKey( );

效果如下:
Alt text

这里有两个奇怪的地方:
1.我的屏幕是1080P的,输出后的数据中,长只有1936.如果减去16的话到正好是1920.但是宽应该是1080,如果任务栏的宽度是24的话,到也能说得过去。只是数据和我们要的有点偏差,这里需要注意一下。
2.window属性居然只有位置、大小和最大化方法。居然没有最小化或还原(退出最大化状态)方法。
Alt text

2.3Timeouts()

这是一个方法,调用这个方法后会得到一个Timeouts对象。这个对象是用来对设置器进行一些设置的。
-ImplicitlyWait(),设置脚步在查找(定位)元素时最大的超时时间。如FindElement()方法在一些超大网页中进行定位时的超时时间。个人感觉这个只是知道就行了,因为要测试的话,不管怎么样还是得先定位到啊。
-SetPageLoadTimeout(),设置页面操作超时时间(不是页面加载时间)。是在页面进行跳转操作或刷新操作时的等待时间。如Navigation对象的各种操作方法,以及在页面上进行某种操作后的等待时间。
-SetScriptTimeout(),设置脚步异步执行的超时时间。这里也从一个角度证明前面推测脚本是用了异步的正确性,但具体是那些地方用了操作,暂时还未知。
代码如下:

            //获得测试器
            IWebDriver selenium = new FirefoxDriver( );
            ITimeouts timeouts = selenium.Manage( ).Timeouts( );

            //设置查找元素最大超时时间为30秒
            timeouts.ImplicitlyWait( new TimeSpan(0,0,30 ) );
            //设置页面操作最大超时时间为30秒
            timeouts.SetPageLoadTimeout( new TimeSpan( 0 , 0 , 30 ) );
            //设置脚本异步最大超时时间为30秒
            timeouts.SetScriptTimeout( new TimeSpan( 0 , 0 , 30 ) );

这个地方设置的参数是TimeSpan类型的,这个类型是.Net里的一个类型,表示一个时间片段。初始化时有多种方式(如下图),但是为了好理解,还是用时分秒的形式进行设置。
Alt text

本节就纪录到这里了,下一节主要是纪录各个操作事件。本节中有几个地方是推测出来的,如果有更详细的说法,请大家指出。。

猜你喜欢

转载自blog.csdn.net/hjkl950217/article/details/54671010