經@吃西瓜的星星提醒
首先我們介紹下Selenium
Selenium也是一個用於Web應用程式測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的使用者在操作一樣。支援的瀏覽器包括IE、Mozilla Firefox、Mozilla Suite等。這個工具的主要功能包括:測試與瀏覽器的相容性——測試你的應用程式看是否能夠很好得工作在不同瀏覽器和作業系統之上。測試系統功能——建立衰退測試檢驗軟體功能和使用者需求。支援自動錄製動作和自動產生。Net、Java、Perl等不同語言的測試指令碼。Selenium 是ThoughtWorks專門為Web應用程式編寫的一個驗收測試工具。
詳細介紹點擊這裡
這裡我們就利用類比真人操作,不會被TX和諧來進行訪問和資料抓取
這裡用到的IDE是VS2017,系統Win10,瀏覽器驅動選擇的是ChromeDriver
建立單元測試解決方案
安裝Nuget包
我這裡使用Google瀏覽器採集資料,所以就使用Google瀏覽器的驅動了,如果不喜歡Google瀏覽器的可以引用別的驅動程式套件
命令
Install-Package Selenium.WebDriverInstall-Package Selenium.WebDriver.ChromeDriver
或者直接管理器安裝 如
Selenium.WebDriver.ChromeDriver是在項目編譯後將Chorme的驅動程式即ChormeDriver.exe程式複製到bin目錄下,
NetCore則是複製到對應的netcoreappv檔案目錄下
這樣基本引用就完成了,下面講具體實現
首先建立一個測試類別Qzone.cs,我們後面所有調用都在測試類別中測試和實現
public class QzoneTest { [Fact] public void QQLogin() { var driver = new ChromeDriver(); driver.Url = "qzone.qq.com/"; driver.Quit(); } }
因為是xUnit測試類別,所以可以直接右鍵調試測試,運行起來可以看到
驅動程式會自動開啟Chrome瀏覽器,並且調轉到指定的頁面.
空間頁面已經開啟了,下面就是登入步驟了
登入有兩種方法,也是QQ自己提供的
第一種 如果有已經登陸的QQ,直接點擊頭像就可以登入
第二種 輸入帳號密碼登入
下面我們來詳細介紹
先說第二種,第一種比較簡單,第二種學會之後,第一種就so easy了
我們需要找到文字框 輸入帳號和密碼
這裡我們就用到了Selenium尋找元素的方法了
這裡給我們提供了很多尋找元素的方法,根據名字我們就能明白它的意思
var driver = new ChromeDriver();driver.FindElement();driver.FindElementByClassName();driver.FindElementByCssSelector();driver.FindElementById();driver.FindElementByName();driver.FindElementByTagName();driver.FindElementByXPath()
我們使用ByXPath方法來尋找元素,XPath的詳細介紹可以自行瞭解下,我這裡只給大家介紹如何快速尋找XPath
剛才開啟的空間地址,找到文字框,然後檢查元素,右側元素位置右鍵->Copy->Copy XPath
可以得到這樣一個地址
//*[@id="u"]
同樣的方法找到密碼框
//*[@id="p"]
通過這個xpath我們可以找到使用者名稱的xpath路徑,然後在程式裡面這樣寫
try { var userName = driver.FindElementByXPath("//*[@id='u']"); //這裡的userName就是使用者名稱的文字框 //設定使用者名稱的值 userName.SendKeys("123456"); var pwd = driver.FindElementByXPath("//*[@id='p']"); pwd.SendKeys("********"); } finally { driver.Quit(); }
運行後出現異常
不要慌,這個是因為瀏覽器驅動沒有找到元素導致的,我們來仔細檢查一下
原來文字框是嵌套在一個Iframe中的,怪不得當前驅動程式無法找到元素,因為當前驅動只會找到當前串連下的元素,嵌套元素不包含在內
那麼我們就用到了切換文法
try { //切換文法有兩種,一種是根據索引切換,另外一種根據iframe名稱切換 //這裡我們使用name切換 ITargetLocator tagetLocator = driver.SwitchTo(); //tagetLocator.Frame(1); //frame index. tagetLocator.Frame("login_frame"); //frame frame name. var userName = driver.FindElementByXPath("//*[@id='u']"); //這裡的userName就是使用者名稱的文字框 //設定使用者名稱的值 userName.SendKeys("123456"); var pwd = driver.FindElementByXPath("//*[@id='p']"); pwd.SendKeys("********"); } finally { driver.Quit(); }
然後調試測試,如
這樣就把值填寫到文字框中了
最後就是點擊登入了,找到登入按鈕元素,Click it 同樣的方式找到登入按鈕元素 並且點擊
[Fact] public void QQLogin() {
dynamic type = (new PictureTest()).GetType(); string currentDirectory = Path.GetDirectoryName(type.Assembly.Location); var driver = new ChromeDriver(currentDirectory); driver.Url = "qzone.qq.com/"; try { //切換文法有兩種,一種是根據索引切換,另外一種根據iframe名稱切換 //這裡我們使用name切換 ITargetLocator tagetLocator = driver.SwitchTo(); //tagetLocator.Frame(1); //frame index. tagetLocator.Frame("login_frame"); //frame frame name. var userName = driver.FindElementByXPath("//*[@id='u']"); //這裡的userName就是使用者名稱的文字框 //設定使用者名稱的值 userName.SendKeys("123456"); var pwd = driver.FindElementByXPath("//*[@id='p']"); pwd.SendKeys("********"); var btnLogin = driver.FindElementByXPath("//*[@id='login_button']"); //這裡是判斷登入按鈕是否可見,可以不寫,直接調用click方法 if (btnLogin != null && btnLogin.Displayed == true) { btnLogin.Click(); } } finally { driver.Quit(); } }
然後就登入成功了
做一下總結,用到的幾個關鍵文法
//Iframe切換,如果需要捕獲的元素不在當前頁面,則找到嵌套頁面進行切換//切換文法有兩種,一種是根據索引切換,另外一種根據iframe名稱切換 ITargetLocator tagetLocator = driver.SwitchTo(); //tagetLocator.Frame(1); //frame index. tagetLocator.Frame("login_frame"); //frame frame name.//尋找元素方法,可以使用css定位 var userName = driver.FindElementByXPath("//*[@id='u']");//設定文字框的值SendKeys userName.SendKeys("123456");//元素點擊事件 var btnLogin = driver.FindElementByXPath("//*[@id='login_button']"); btnLogin.Click();
只要瞭解下驅動程式操作瀏覽器的一些方法就可以自己摸索實現想要的東西,比如點擊切換登入框和快捷登入
比如找到相簿元素並點擊,找到菜單說說元素並點擊,設定文字框值,發說說,寫留言 都可以摸索使用
登入先講到這裡,改天寫一下說說或者留言板,或者相簿圖片的儲存