經@吃西瓜的星星提醒
首先我們介紹下Selenium
Selenium也是一個用於Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。支持的瀏覽器包括IE、Mozilla Firefox、Mozilla Suite等。這個工具的主要功能包括:測試與瀏覽器的兼容性——測試你的應用程序看是否能夠很好得工作在不同瀏覽器和操作系統之上。測試系統功能——創建衰退測試檢驗軟件功能和用戶需求。支持自動錄制動作和自動生成。Net、Java、Perl等不同語言的測試腳本。Selenium 是ThoughtWorks專門為Web應用程序編寫的一個驗收測試工具。
詳細介紹點擊這里
這里我們就利用模擬真人操作,不會被TX和諧來進行訪問和數據抓取
這里用到的IDE是VS2017,系統Win10,瀏覽器驅動選擇的是ChromeDriver
新建單元測試解決方案

安裝Nuget包
我這里使用谷歌瀏覽器采集數據,所以就使用谷歌瀏覽器的驅動了,如果不喜歡谷歌瀏覽器的可以引用別的驅動程序包
命令
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
