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( );
效果如下:
这里有两个奇怪的地方:
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(0,0,30 ) );
//设置页面操作最大超时时间为30秒
timeouts.SetPageLoadTimeout( new TimeSpan( 0 , 0 , 30 ) );
//设置脚本异步最大超时时间为30秒
timeouts.SetScriptTimeout( new TimeSpan( 0 , 0 , 30 ) );
这个地方设置的参数是TimeSpan类型的,这个类型是.Net里的一个类型,表示一个时间片段。初始化时有多种方式(如下图),但是为了好理解,还是用时分秒的形式进行设置。
本节就纪录到这里了,下一节主要是纪录各个操作事件。本节中有几个地方是推测出来的,如果有更详细的说法,请大家指出。。