//切换到注册窗口再输入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
//显示初始Cookie的内容
Console.WriteLine("--------------------")
Console.WriteLine($"当前Cookie集合的数量:\t{listCookie.AllCookies.Count}")
for( int i = 0
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
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( );
timeouts.ImplicitlyWait( new TimeSpan(0,0,30 ) );
timeouts.SetPageLoadTimeout( new TimeSpan( 0 , 0 , 30 ) );
timeouts.SetScriptTimeout( new TimeSpan( 0 , 0 , 30 ) );
这个地方设置的参数是TimeSpan类型的,这个类型是.Net里的一个类型,表示一个时间片段。初始化时有多种方式(如下图),但是为了好理解,还是用时分秒的形式进行设置。
本节就纪录到这里了,下一节主要是纪录各个操作事件。本节中有几个地方是推测出来的,如果有更详细的说法,请大家指出。。
C#Selenium学习(四) 上一节中主要纪录了怎么从页面上获取信息和对话框的处理。这一节主要纪录多窗口的处理。多标签或多个浏览器窗口都包括在里面。主要测试多个窗口之间的切换1.获得窗口标识WindowHandles要在不同的浏览器之间切换,必须获得不同的窗口(标签)的标识符。用一个集合来保存这些数据。当需要到新窗口里进行操作时,需要将测试器前往新的窗口。开始创建的测试器是
import pickle
# cookie.pkl文件
pickle.dump(self.driver.get_cookies(), open('cookies.pkl', 'wb'))
下次访问就可以加载之前保存的cookie.pkl文件
#先访问网站
self.driver.get(target_url)
#再加载cookie
cookies = pickle.load(open('cookies.pkl', rb))
for co
Selenium中使用Cookies绕过登录
在使用selenium测试后台时常常每个流程都需要走登录流程,这样自然比较浪费时间。如果遇到登录需要输入验证码等情况,就可能出师未捷身先死。
在Web应用中,登录状态通常是通过Cookie中对应的session id验证的。也是就是说,我们只要携带上登录后的Cookies,浏览器就会自动识别我们为登录状态。由于Selenium每次启动的浏览器是一个隔离的环境,不能直接使用本地已经保存的Cookies值,我们需要通过driver的add_cookie()方法手动添