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來表示我們成功了
在上面的代碼基礎下 添加下面代碼
//切換到注冊視窗再輸入
selenuim.SwitchTo( ).Window( listHand[ ] );
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 = ; 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( );
運作效果如下:
這裡需要說明一點的就是,這裡新添加的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( );
效果如下:
這裡有兩個奇怪的地方:
1.我的螢幕是1080P的,輸出後的資料中,長隻有1936.如果減去16的話到正好是1920.但是寬應該是1080,如果工作列的寬度是24的話,到也能說得過去。隻是資料和我們要的有點偏差,這裡需要注意一下。
2.window屬性居然隻有位置、大小和最大化方法。居然沒有最小化或還原(退出最大化狀态)方法。
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裡的一個類型,表示一個時間片段。初始化時有多種方式(如下圖),但是為了好了解,還是用時分秒的形式進行設定。
本節就紀錄到這裡了,下一節主要是紀錄各個操作事件。本節中有幾個地方是推測出來的,如果有更詳細的說法,請大家指出。。