[Python爬蟲] Selenium實現自動登入163郵箱和Locating Elements介紹

來源:互聯網
上載者:User

標籤:python   selenium   自定登入   定位元素   loacting elements   

        前三篇文章介紹了安裝過程和通過Selenium實現訪問Firefox瀏覽器並自動搜尋"Eastmount"關鍵字及的功能。而這篇文章主要簡單介紹如何?自動登入163郵箱,同時繼續介紹Selenium+Python官網Locating Elements部分內容。
        希望該篇基礎性文章對你有所協助,如果有錯誤或不足之處,請海涵~
        [Python爬蟲] 在Windows下安裝PhantomJS和CasperJS及入門介紹(上)
        [Python爬蟲] 在Windows下安裝PIP+Phantomjs+Selenium
        [Python爬蟲] Selenium自動訪問Firefox和Chrome並實現搜尋


一. Selenium自動登入

        代碼如下所示:

from selenium import webdriverfrom selenium.webdriver.common.keys import Keysimport time#類比登陸163郵箱driver = webdriver.Firefox()driver.get("http://mail.163.com/")#使用者名稱 密碼elem_user = driver.find_element_by_name("username")elem_user.send_keys("15201615157")elem_pwd = driver.find_element_by_name("password")elem_pwd.send_keys("********")elem_pwd.send_keys(Keys.RETURN)time.sleep(5)assert "baidu" in driver.titledriver.close()driver.quit()
        運行結果如所示,自動開啟Firefox瀏覽器並輸入使用者名稱和密碼實現郵箱登入。



        代碼非常簡單,其中的原理也很簡單:通過driver訪問Firefox瀏覽器及URL,同時find_element_by_name找到網頁HTML原始碼中對應的值並填充,最後調用Keys實現類比操作鍵盤Keys.RETURN實現。該斷言結果是不存在的,主要是用於防止關閉瀏覽器。
        同時輸入使用者名稱或密碼錯誤會提示,其實就是瀏覽器。

原理解釋 
        兩年前在學習C#網路編程時,我成寫過Winform自動訪問163郵箱的文章:
        C# 網路編程之網頁自動登入 (一).使用WebBrower控制項模仿登入
        通過對比,Python簡短高效的優勢就顯示出來的,其中163郵箱登入介面HTML源碼也沒有修改和修複過,這是我意料之外的。
        其中通過尋找該登入頁面發現使用者名稱Id為“idInput”,密碼Id為“pwdInput”,登入按鈕ID為“loginBtn”。id和name:
          <input class="" tabindex="1" title="請輸入帳號" id="idInput" name="username" type="text" value=""..
          <input class="" tabindex="2" title="請輸入密碼" id="pwdInput" name="password" type="password" />
          <button id="loginBtn" class="" type="submit">登  錄</button>
        如所示一目瞭然:


         這部分文章雖然簡單,但是作為基礎文章在合適不過了,同時通過webdriver的driver.find_element_by_name引出下面的基礎知識介紹,畢竟實踐例子才是學習Selenium的動力源泉。
        同樣下面這段代碼可實現自動登入CSDN,是不是可以通過它實現暴力破解密碼呢?
from selenium import webdriverfrom selenium.webdriver.common.keys import Keysimport timedriver = webdriver.Firefox()driver.get("https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn")elem_user = driver.find_element_by_name("username")elem_user.send_keys("Eastmount")elem_pwd = driver.find_element_by_name("password")elem_pwd.send_keys("********")elem_pwd.send_keys(Keys.RETURN)time.sleep(5)assert "baidu" in driver.titledriver.close()driver.quit()



二. Locating Elements介紹
        PS:第一次上傳翻譯博文,如果有錯誤還請見諒!
        官網地址:http://selenium-python.readthedocs.org/locating-elements.html
        這裡有各種策略用於定位網頁中的元素(locate elements),你可以選擇最適合的方案,Selenium提供了一下方法來定義一個頁面中的元素:
  • find_element_by_id
  • find_element_by_name
  • find_element_by_xpath
  • find_element_by_link_text
  • find_element_by_partial_link_text
  • find_element_by_tag_name
  • find_element_by_class_name
  • find_element_by_css_selector
        下面是尋找多個元素(這些方法將返回一個列表):
  • find_elements_by_name
  • find_elements_by_xpath
  • find_elements_by_link_text
  • find_elements_by_partial_link_text
  • find_elements_by_tag_name
  • find_elements_by_class_name
  • find_elements_by_css_selector
        除了上面給出的公用方法,這裡也有兩個在頁面對象定位器有用的私人方法。這兩個私人方法是find_element和find_elements,用法樣本:
from selenium.webdriver.common.by import Bydriver.find_element(By.XPATH, '//button[text()="Some text"]')driver.find_elements(By.XPATH, '//button')
       這些都是通過類可擷取的屬性:
ID = "id"XPATH = "xpath"LINK_TEXT = "link text"PARTIAL_LINK_TEXT = "partial link text"NAME = "name"TAG_NAME = "tag name"CLASS_NAME = "class name"CSS_SELECTOR = "css selector"

1 Locating By Id

       當你知道一個元素的id屬性時使用該功能。有了這個方法,用id屬性值匹配時第一個被定位的元素將被返回。如果沒有元素匹配id值,一個NoSuchElementException異常將會拋出。例如,參考這個頁面源碼:

<html> <body>  <form id="loginForm">   <input name="username" type="text" />   <input name="password" type="password" />   <input name="continue" type="submit" value="Login" />  </form> </body><html>
        表單form元素可以被如下方式定位:
login_form = driver.find_element_by_id('loginForm')

2 Locating By Name

        當你知道一個元素的name屬性時使用該方法。通過該方法,第一個滿足name屬性值的元素將被匹配返回,如果沒有元素匹配,將拋出一個NoSuchElementException異常。例如,參考下面源碼:

<html> <body>  <form id="loginForm">   <input name="username" type="text" />   <input name="password" type="password" />   <input name="continue" type="submit" value="Login" />   <input name="continue" type="button" value="Clear" />  </form></body><html>
        定位username&password元素方法如下:
username = driver.find_element_by_name('username')password = driver.find_element_by_name('password')
        在"Clear"按鈕之前會給出"Login"登入按鈕:
continue = driver.find_element_by_name('continue')

3 Locating By XPath
        XPath是用於定位XML文檔中節點的語言。正如HTML可以是XML(XHTML)的一個實現,Selenium使用者可以利用這個強大的語言來跟蹤Web應用程式中的元素。XPath擴充已經超出(以及支援)了按照id或name屬性定位的簡單方法,並開發了各種新的可能,如定位頁面上的第三個複選框(checkbox)。
        其中使用XPath的一個主要原因是:當你沒有一個合適的ID或Name屬性來定位你需要尋找的元素時,你可以使用XPath去定位這個絕對元素(不建議這樣),或者相對一個有id或name屬性的元素定位。XPath定位器也可以通過其他不止是id和name屬性進行指定元素。
        絕對XPath包含定位的所有元素,這些元素從根(HTML)到其結果可能會失敗,只有稍微調整到應用程式。通過找到附近的一個元素的id或name屬性(理想的父元素),你才可以根據之間的關係定位到你追蹤的元素。這是不太可能改變的,並且會使你的測試更加的健壯。例如參考下面這段原始碼:
<html> <body>  <form id="loginForm">   <input name="username" type="text" />   <input name="password" type="password" />   <input name="continue" type="submit" value="Login" />   <input name="continue" type="button" value="Clear" />  </form></body><html>
        這個表單form元素可能通過如下方法被定位:
login_form = driver.find_element_by_xpath("/html/body/form[1]")login_form = driver.find_element_by_xpath("//form[1]")login_form = driver.find_element_by_xpath("//form[@id='loginForm']")
        [1] 絕對路徑(如果HTML有稍微的改動,就會被破壞)
        [2] 在HTML中的第一個表單元素
        [3] 指定屬性名稱為id且值為loginForm的表單元素
        定位username元素的方法如下:
username = driver.find_element_by_xpath("//form[input/@name='username']")username = driver.find_element_by_xpath("//form[@id='loginForm']/input[1]")username = driver.find_element_by_xpath("//input[@name='username']")
        [1] 第一個form元素通過一個input子項目,name屬性和值為username實現
        [2] 通過id=loginForm值的form元素找到第一個input子項目
        [3] 屬性名稱為name且值為username的第一個input元素
         定位"Clear"按鈕元素的方法如下:
clear_button = driver.find_element_by_xpath("//input[@name='continue'][@type='button']")clear_button = driver.find_element_by_xpath("//form[@id='loginForm']/input[4]")
        [1] 屬性名稱為name其值為continue和屬性名稱為type其值為button的Input控制項
        [2] 屬性id=loginForm的form元素的第四個input子項目
        上面這些例子涉及一些基礎知識,更多詳情請參考下面的建議:
  • W3Schools XPath Tutorial
  • W3C XPath Recommendation
  • XPath Tutorial - with interactive examples.
        這裡也有幾個非常實用的附加組件,可以協助發現元素的XPath:
  • XPath Checker - suggests XPath and can be used to test XPath results.
  • Firebug - XPath suggestions are just one of the many powerful features of this very useful add-on.
  • XPath Helper - for Google Chrome

4 Locating Hyperlinks By Link Text
        當你知道一個錨標記內使用連結文本就使用該方法。通過這個策略,第一個匹配這個link text值的元素將被返回。如果沒有元素匹配這個連結文本,將拋出一個NoSuchElementException異常。樣本的原始碼如下:
<html> <body>  <p>Are you sure you want to do this?</p>  <a href="continue.html">Continue</a>  <a href="cancel.html">Cancel</a></body><html>
        這個continue.html連結定位的方法如下,partial表示部分匹配:
continue_link = driver.find_element_by_link_text('Continue')continue_link = driver.find_element_by_partial_link_text('Conti')


5 Locating Elements By Tag Name
        當你想通過tag name(標記名)定位一個元素時可以使用該方法。同樣,第一個給出的tag name元素將被返回,如果沒有匹配的標記名,將拋出一個NoSuchElementException異常。樣本的原始碼如下:
<html> <body>  <h1>Welcome</h1>  <p>Site content goes here.</p></body><html>
        定位heading(h1)元素的方法如下:
heading1 = driver.find_element_by_tag_name('h1')


6 Locating Elements By Class Name
        介紹類似,用於通過類屬性名稱(class attribute name)進行定位一個元素。樣本原始碼如下:
<html> <body>  <p class="content">Site content goes here.</p></body><html>
        其中元素"p"的定位方法如下:
content = driver.find_element_by_class_name('content')


7 Locating Elements By CSS Selectors
        當你想要通過CSS選取器文法定位一個元素時,可以使用該方法。它將返回第一個與CSS選取器匹配的元素,如果沒有匹配CSS選取器的元素,將返回一個NoSuchElementException異常。執行個體原始碼如下所示:
<html> <body>  <p class="content">Site content goes here.</p></body><html>
        其中元素"p"的定位方法如下:
content = driver.find_element_by_css_selector('p.content')
        Sauce實驗室有非常好的關於CSS選取器的文檔:
           Sauce Labs has good documentation on CSS selectors.

      (By:Eastmount 2015-8-21 下午6點   http://blog.csdn.net/eastmount/)

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

[Python爬蟲] Selenium實現自動登入163郵箱和Locating Elements介紹

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.