經@吃西瓜的星星提醒css
首先咱們介紹下Seleniumgit
Selenium也是一個用於Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操做同樣。支持的瀏覽器包括IE、Mozilla Firefox、Mozilla Suite等。這個工具的主要功能包括:測試與瀏覽器的兼容性——測試你的應用程序看是否可以很好得工做在不一樣瀏覽器和操做系統之上。測試系統功能——建立衰退測試檢驗軟件功能和用戶需求。支持自動錄製動做和自動生成。Net、Java、Perl等不一樣語言的測試腳本。Selenium 是ThoughtWorks專門爲Web應用程序編寫的一個驗收測試工具。github
詳細介紹點擊這裏瀏覽器
這裏咱們就利用模擬真人操做,不會被TX和諧來進行訪問和數據抓取app
這裏用到的IDE是VS2017,系統Win10,瀏覽器驅動選擇的是ChromeDriver工具
新建單元測試解決方案單元測試
安裝Nuget包測試
我這裏使用谷歌瀏覽器採集數據,因此就使用谷歌瀏覽器的驅動了,若是不喜歡谷歌瀏覽器的能夠引用別的驅動程序包ui
命令 spa
Install-Package Selenium.WebDriver
Install-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 = "https://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 = "https://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();
只要瞭解下驅動程序操做瀏覽器的一些方法就能夠本身摸索實現想要的東西,好比點擊切換登陸框和快捷登陸
好比找到相冊元素並點擊,找到菜單說說元素並點擊,設置文本框值,發說說,寫留言 均可以摸索使用
登陸先講到這裏,改天寫一下說說或者留言板,或者相冊圖片的保存
git 源碼地址:https://github.com/ermpark/CrawlingQzone