標籤:key pwd 密碼登入 test http 安裝 new string 步驟
建立單元測試解決方案
安裝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 = "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(); } }
然後就登入成功了
只要瞭解下驅動程式操作瀏覽器的一些方法就可以自己摸索實現想要的東西,比如點擊切換登入框和快捷登入
比如找到相簿元素並點擊,找到菜單說說元素並點擊,設定文字框值,發說說,寫留言 都可以摸索使用
登入先講到這裡,改天寫一下說說或者留言板,或者相簿圖片的儲存
C#使用Selenium實現QQ空間資料抓取 登入QQ空間