天天看點

C# Selenium學習(四)-Cookie和視窗處理C#Selenium學習(四)

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( );

        }
           

效果如下:

C# Selenium學習(四)-Cookie和視窗處理C#Selenium學習(四)

将測試器改為火狐後,效果如下:

C# Selenium學習(四)-Cookie和視窗處理C#Selenium學習(四)

可見各浏覽器的辨別符是不一樣的。

下面切換到新打開的視窗後,輸入一個12345來表示我們成功了

在上面的代碼基礎下 添加下面代碼

//切換到注冊視窗再輸入
            selenuim.SwitchTo( ).Window( listHand[  ] );
            selenuim.FindElement( By.Name( "userName" ) ).SendKeys("12345");
           

結果如圖:

C# Selenium學習(四)-Cookie和視窗處理C#Selenium學習(四)

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 =  ; 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(  ) );

            listCookie.AddCookie( newCookie );
            Console.WriteLine( "--------------------" );
            Console.WriteLine( $"目前Cookie集合的數量:\t{listCookie.AllCookies.Count}" );
            for( int i =  ; 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( );
           

運作效果如下:

C# Selenium學習(四)-Cookie和視窗處理C#Selenium學習(四)
C# Selenium學習(四)-Cookie和視窗處理C#Selenium學習(四)

這裡需要說明一點的就是,這裡新添加的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( );
           

效果如下:

C# Selenium學習(四)-Cookie和視窗處理C#Selenium學習(四)

這裡有兩個奇怪的地方:

1.我的螢幕是1080P的,輸出後的資料中,長隻有1936.如果減去16的話到正好是1920.但是寬應該是1080,如果工作列的寬度是24的話,到也能說得過去。隻是資料和我們要的有點偏差,這裡需要注意一下。

2.window屬性居然隻有位置、大小和最大化方法。居然沒有最小化或還原(退出最大化狀态)方法。

C# Selenium學習(四)-Cookie和視窗處理C#Selenium學習(四)

2.3Timeouts()

這是一個方法,調用這個方法後會得到一個Timeouts對象。這個對象是用來對設定器進行一些設定的。

-ImplicitlyWait(),設定腳步在查找(定位)元素時最大的逾時時間。如FindElement()方法在一些超大網頁中進行定位時的逾時時間。個人感覺這個隻是知道就行了,因為要測試的話,不管怎麼樣還是得先定位到啊。

-SetPageLoadTimeout(),設定頁面操作逾時時間(不是頁面加載時間)。是在頁面進行跳轉操作或重新整理操作時的等待時間。如Navigation對象的各種操作方法,以及在頁面上進行某種操作後的等待時間。

-SetScriptTimeout(),設定腳步異步執行的逾時時間。這裡也從一個角度證明前面推測腳本是用了異步的正确性,但具體是那些地方用了操作,暫時還未知。

代碼如下:

//獲得測試器
            IWebDriver selenium = new FirefoxDriver( );
            ITimeouts timeouts = selenium.Manage( ).Timeouts( );

            //設定查找元素最大逾時時間為30秒
            timeouts.ImplicitlyWait( new TimeSpan(,, ) );
            //設定頁面操作最大逾時時間為30秒
            timeouts.SetPageLoadTimeout( new TimeSpan(  ,  ,  ) );
            //設定腳本異步最大逾時時間為30秒
            timeouts.SetScriptTimeout( new TimeSpan(  ,  ,  ) );
           

這個地方設定的參數是TimeSpan類型的,這個類型是.Net裡的一個類型,表示一個時間片段。初始化時有多種方式(如下圖),但是為了好了解,還是用時分秒的形式進行設定。

C# Selenium學習(四)-Cookie和視窗處理C#Selenium學習(四)

本節就紀錄到這裡了,下一節主要是紀錄各個操作事件。本節中有幾個地方是推測出來的,如果有更詳細的說法,請大家指出。。