如何來(lái)定位Web頁(yè)面中基本的元素嗽元,在之前的文章已經(jīng)介紹過(guò)了邢羔。在本文中將介紹如何來(lái)控制和操作瀏覽器篙骡。我們先看看Selenium API 中提供的方法囚似。
Selenium API 方法
Selenium API對(duì)Webdriver定義如下:
從中我們可以看到主要的方法有Manage()闻伶、Navigate()滨攻、ITargetLocator()、Quit()等
訪問(wèn)指定網(wǎng)址
示例代碼如下:
string url = "https://www.baidu.com";
driver.Navigate().GoToUrl(url);
從API里面可以看到IWebdriver里面有一個(gè)屬性Url蓝翰,也可以采用以下方式實(shí)現(xiàn)與上面一樣的目的光绕,如下所示:
driver.Url = "https://www.baidu.com";
訪問(wèn)同一網(wǎng)站的不同頁(yè)面
driver.Navigate().GoToUrl()中所輸入的網(wǎng)址是一個(gè)完整的URL,但對(duì)于測(cè)試同一網(wǎng)站中的不同頁(yè)面畜份,其實(shí)不需要每次都輸入完整的URL诞帐。我們可以創(chuàng)建一個(gè)方法來(lái)進(jìn)行拼接,即可達(dá)到同樣的目的爆雹,也能提高代碼的復(fù)用度停蕉。我們以訪問(wèn)CSDN博客為例愕鼓,詳細(xì)代碼如下:
IWebDriver driver = new ChromeDriver();
string mainUrl = "http://blog.csdn.net";
//創(chuàng)建訪問(wèn)方法
public void VisitWebSite(string subUrl)
{
driver.Navigate().GoToUrl(mainUrl+subUrl);
}
[TestMethod]
public void TestVisitWebSite()
{
//訪問(wèn)huilan_same的博客
VisitWebSite("/huilan_same");
Thread.Sleep(1000);
//訪問(wèn)niubitianping的博客
VisitWebSite("/niubitianping");
//訪問(wèn)博客主頁(yè)
VisitWebSite("/");
Thread.Sleep(1000);
//訪問(wèn)Hadoop專(zhuān)欄
VisitWebSite("/column/details/hadoop-force.html");
driver.Quit();
}
這種方式還有另外一個(gè)好處就是如果你需要在不同的服務(wù)器上面運(yùn)行和測(cè)試相同的Web程序,而僅僅是更改了網(wǎng)址的部分名稱(chēng)慧起,那么只需要更改一行代碼菇晃,如下所示:
string mainUrl = "http://www.csdn.net";
瀏覽器導(dǎo)航操作
在進(jìn)行Web頁(yè)面瀏覽時(shí),通過(guò)會(huì)有前進(jìn)蚓挤、后退磺送、刷新等操作,通過(guò)Selenium API可以得知屈尼,實(shí)現(xiàn)該操作主要方法為Navigate()
//后退
driver.Navigate().Back();
//前進(jìn)
driver.Navigate().Forward();
//刷新
driver.Navigate().Refresh();
移動(dòng)瀏覽器
在測(cè)試過(guò)程中册着,我們可以將瀏覽器窗口移動(dòng)到指定的位置,從而避免對(duì)其他操作或本身生成影響脾歧。而把瀏覽器移動(dòng)到窗口其他位置并不影響最終的測(cè)試結(jié)果甲捏。示例代碼如下:
driver.Manage().Window.Position = new System.Drawing.Point(200,500);
Thread.Sleep(2000);
driver.Manage().Window.Position = new System.Drawing.Point(0, 0);
位置(0,0)則代表所處位置是屏幕的左上方。
設(shè)置瀏覽器窗口大小
瀏覽器窗口大小設(shè)定主要包含三種鞭执,用戶自定義大小司顿、最大化和最小化
- 用戶自定義瀏覽器大小
driver.Manage().Window.Size = new System.Drawing.Size(800,600);
用戶自定義瀏覽器大小帘撰,需要使用到.NET里面的System.Drawing抡秆。
- 瀏覽器最大化
driver.Manage().Window.Maximize();
- 瀏覽器最小化
在Selenium API 中并沒(méi)有提供最小化瀏覽器的方法,但我們可以通過(guò)移動(dòng)窗口到指定位置實(shí)現(xiàn)同樣的目的抖誉,示例代碼如下:
driver.Manage().Window.Position = new System.Drawing.Point(-1500, 0);
Thread.Sleep(2000);
driver.FindElement(By.PartialLinkText("博客專(zhuān)家")).Click();
Thread.Sleep(2000);
driver.Manage().Window.Position = new System.Drawing.Point(300, 400);
driver.Manage().Window.Maximize();
拖動(dòng)滾動(dòng)條
有些Web控件或元素在默認(rèn)窗口大小估脆,無(wú)法直接看見(jiàn)钦奋,需要調(diào)整滾動(dòng)條位置才能看見(jiàn)。這個(gè)時(shí)候我們?cè)跍y(cè)試的過(guò)程中疙赠,可以通過(guò)JavaScript來(lái)模擬拖動(dòng)滾動(dòng)條付材。代碼如下:
driver.Url = "http://blog.csdn.net/";
driver.Manage().Window.Maximize();
Thread.Sleep(1000);
IWebElement eles = driver.FindElement(By.PartialLinkText("公司簡(jiǎn)介"));
int elesPostionX = eles.Location.X;
int elesPostionY = eles.Location.Y;
string js = "window.scroll(" + elesPostionX + "," + elesPostionY + ")";
((IJavaScriptExecutor)driver).ExecuteScript(js);
eles.Click();
在窗口和Tabs頁(yè)面中切換
在Web頁(yè)面中,如果一個(gè)鏈接含有target="_blank"標(biāo)簽時(shí)圃阳,則代表在點(diǎn)擊鏈接后厌衔,將在瀏覽器新窗口或新Tab中打開(kāi)鏈接(取決于瀏覽器的設(shè)置)。針對(duì)這種情況捍岳,我們可以使用方法SwitchTo()來(lái)進(jìn)行切換到不同的窗口或Tab中富寿。示例代碼如下:
driver.Url = "http://blog.csdn.net/";
driver.Manage().Window.Maximize();
Thread.Sleep(1000);
IWebElement eles = driver.FindElement(By.PartialLinkText("公司簡(jiǎn)介"));
int elesPostionX = eles.Location.X;
int elesPostionY = eles.Location.Y;
string js = "window.scroll(" + elesPostionX + "," + elesPostionY + ")";
((IJavaScriptExecutor)driver).ExecuteScript(js);
//進(jìn)行點(diǎn)擊后將在新的Tab選項(xiàng)卡中打開(kāi)
eles.Click();
ReadOnlyCollection<string> windowsHandles = driver.WindowHandles;
//切換到新窗口
driver.SwitchTo().Window(windowsHandles[1]);
Assert.IsTrue(driver.PageSource.Contains("創(chuàng)立于1999年,是中國(guó)最大的開(kāi)發(fā)者服務(wù)平臺(tái)"));
//返回最初的窗口
driver.SwitchTo().Window(windowsHandles[0]);
ReadOnlyCollection<IWebElement> elements = driver.FindElements(By.XPath("http://div[@id='pub_footerall']/dl/dd[1]/a"));
Assert.AreEqual<int>(9,elements.Count);
driver.Quit();