前面我們知道了如何進行對象的定位,下面我們進一步來了解selenium的一些功能特性:
1>等待:我們在處理對象的時候,對象並不能及時的“出現”,那么此時我們就需要進行等待了。
driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(20)); //這里的20,是以"s" 為單位,這里的數值可以根據實際情況來設置,
還有一種等待方式:使用WebDriverWait對象,同樣強大。
public IWebElement WaitForElement(IWebDriver driver, string el_id,int timeout) //找到元素就返回 { IWebElement ele = null; try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeout)); ele = wait.Until<IWebElement>((d) => { return d.FindElement(By.Id(el_id)); }); } catch { Console.WriteLine("12e"); } return ele; }
2>獲取窗體句柄:
driver.CurrentWindowHandle
3>窗體轉換:
driver.SwitchTo().Window();
4>使用Actions
var xx = driver.FindElement(By.Id("id")); Actions builder = new Actions(driver); builder.MoveToElement(xx).Perform();
5>根據鏈接文本定位對象(不太適用本地化測試)
driver.FindElement(By.PartialLinkText("登錄"));
6>處理彈出框
driver.SwitchTo().Alert().Accept()//簡單講就是點擊yes driver.SwitchTo().Alert().Dismiss()//點擊No
7>判斷頁面字符串
driver.PageSource.Contains("any word;");
下面來看具體的實例:
登陸百度首頁->搜索“博客園”->登陸博客園->退出->處理彈出框
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; //添加selenium的引用 using OpenQA.Selenium; using OpenQA.Selenium.IE; using OpenQA.Selenium.Support.UI; using OpenQA.Selenium.Interactions; //添加引用-在程序集中添加System.Drawing using System.Drawing; using System.Drawing.Imaging; namespace Selenium { class Program { static void Main(string[] args) { //此時記得添加路徑 using (var driver = new InternetExplorerDriver(@"D:\Selenium\IEDriverServer_x64_2.34.0\")) { //進入百度首頁 driver.Navigate().GoToUrl(@"http://www.baidu.com"); Thread.Sleep(1000);
//是否包含"百度"這個字符串,可以用來判斷頁面是否出現
if (driver.PageSource.Contains("百度")){ Console.WriteLine(" 123");
}
//設置窗體最大化 driver.Manage().Window.Maximize(); Thread.Sleep(1000); //找到對象 var colSearchBox = driver.FindElementsByName("wd"); var btnClick = driver.FindElement(By.Id("su1")); //發送搜索內容 colSearchBox[1].SendKeys("bokeyuan"); //Thread.Sleep(1000); //等待搜索結果 WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); IWebElement searchResutl = null; try { searchResutl = wait.Until<IWebElement>((d) => { return d.FindElement(By.ClassName("bdsug")); }); } catch(Exception e) { Console.WriteLine("Timeout to find element:" + " "+ e.Message.ToString()); } //搜索結果數量 var searchResult_Children = searchResutl.FindElements(By.TagName("li")); foreach (IWebElement child in searchResult_Children) { if (child.Text.Equals("博客園")) { //選擇正確的搜索對象 child.Click(); break; } } //設置頁面加載時間 driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(20)); //獲取當前頁面句柄 ,適用於一個窗體 //var cc = driver.CurrentWindowHandle; //進入首頁 var homePage = driver.FindElement(By.ClassName("result")); var homePage_child = homePage.FindElement(By.Id("1")); homePage_child.FindElement(By.ClassName("favurl")).Click(); //設置頁面加載時間 driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(20)); //獲取當前網頁的句柄,使用與多個窗體 //那么我們需要的是第二個窗體 var currentWindowHandle = driver.WindowHandles[1]; //因為要現在要處理的對象在新窗體上,所以這里要進行窗體轉換 driver.SwitchTo().Window(currentWindowHandle); //下面將鼠標移動到左邊的".Net技術",此時會滑出相應的模塊 //用XPath定位對象,此處找到"新手區" //移動鼠標 var xx = driver.FindElement(By.Id("cate_item_108698")); Actions builder = new Actions(driver); builder.MoveToElement(xx).Perform(); Thread.Sleep(2000); //使用XPath 找對象 //driver.FindElement(By.Id("cate_sub_block")).FindElement(By.XPath("//div[1]/div[2]/ul[1]/li[1]/a[@href='/cate/beginner/']")).Click(); //div[1]第一個div //上面的比較"笨重",下面的簡單多了 driver.FindElement(By.Id("cate_sub_block")).FindElement(By.XPath("//a[@href='/cate/beginner/']")).Click(); //登陸 //使用PartialLinkText定位對象 var btnLogin1 = driver.FindElement(By.PartialLinkText("登錄")); btnLogin1.Click(); var txtUserName = driver.FindElement(By.Id("tbUserName")); txtUserName.SendKeys("Alvin-x"); var txtPassword = driver.FindElement(By.Id("tbPassword")); txtPassword.SendKeys("123456"); var btnLogin2 = driver.FindElement(By.Id("btnLogin")); btnLogin2.Click(); Thread.Sleep(2000); //使用CssSelector定位對象 //點擊“退出” var btnBackup = driver.FindElement(By.CssSelector("a[href='#']")); btnBackup.Click(); //等待彈出框彈出后再處理它 Thread.Sleep(1000); IAlert result = null; while (1 < 2) { try { result = driver.SwitchTo().Alert(); } catch (Exception) { result = null; } if (result != null) { result.Accept(); break; } } //退出 driver.Quit(); } } } }