小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

[Python爬蟲] Selenium實現(xiàn)自動登錄163郵箱和Locating Elements介紹

 看見就非常 2015-09-18

一. Selenium自動登錄

        代碼如下所示:

  1. from selenium import webdriver  
  2. from selenium.webdriver.common.keys import Keys  
  3. import time  
  4.   
  5. #模擬登陸163郵箱  
  6. driver = webdriver.Firefox()  
  7. driver.get("http://mail.163.com/")  
  8.   
  9. #用戶名 密碼  
  10. elem_user = driver.find_element_by_name("username")  
  11. elem_user.send_keys("15201615157")  
  12. elem_pwd = driver.find_element_by_name("password")  
  13. elem_pwd.send_keys("********")  
  14. elem_pwd.send_keys(Keys.RETURN)  
  15. time.sleep(5)  
  16. assert "baidu" in driver.title  
  17. driver.close()  
  18. driver.quit()  
        運行結(jié)果如下圖所示,自動打開Firefox瀏覽器并輸入用戶名和密碼實現(xiàn)郵箱登錄。


        代碼非常簡單,其中的原理也很簡單:通過driver訪問Firefox瀏覽器及URL,同時find_element_by_name找到網(wǎng)頁HTML源代碼中對應(yīng)的值并填充,最后調(diào)用Keys實現(xiàn)模擬操作鍵盤Keys.RETURN實現(xiàn)。該斷言結(jié)果是不存在的,主要是用于防止關(guān)閉瀏覽器。
        同時輸入用戶名或密碼錯誤會提示,其實就是瀏覽器。

原理解釋 
        兩年前在學(xué)習(xí)C#網(wǎng)絡(luò)編程時,我成寫過Winform自動訪問163郵箱的文章:

        C# 網(wǎng)絡(luò)編程之網(wǎng)頁自動登錄 (一).使用WebBrower控件模仿登錄
        通過對比,Python簡短高效的優(yōu)勢就顯示出來的,其中163郵箱登錄界面HTML源碼也沒有修改和修復(fù)過,這是我意料之外的。
        其中通過查找該登錄頁面發(fā)現(xiàn)用戶名Id為“idInput”,密碼Id為“pwdInput”,登錄按鈕ID為“l(fā)oginBtn”。如圖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>

        如下圖所示一目了然:


        這部分文章雖然簡單,但是作為基礎(chǔ)文章在合適不過了,同時通過webdriver的driver.find_element_by_name引出下面的基礎(chǔ)知識介紹,畢竟實踐例子才是學(xué)習(xí)Selenium的動力源泉。
        同樣下面這段代碼可實現(xiàn)自動登錄CSDN,是不是可以通過它實現(xiàn)暴力破解密碼呢?
  1. from selenium import webdriver  
  2. from selenium.webdriver.common.keys import Keys  
  3. import time  
  4.   
  5. driver = webdriver.Firefox()  
  6. driver.get("https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn")  
  7. elem_user = driver.find_element_by_name("username")  
  8. elem_user.send_keys("Eastmount")  
  9. elem_pwd = driver.find_element_by_name("password")  
  10. elem_pwd.send_keys("********")  
  11. elem_pwd.send_keys(Keys.RETURN)  
  12. time.sleep(5)  
  13. assert "baidu" in driver.title  
  14. driver.close()  
  15. driver.quit()  



二. Locating Elements介紹


        PS:第一次上傳翻譯博文,如果有錯誤還請見諒!
        官網(wǎng)地址:http://selenium-python./locating-elements.html
        這里有各種策略用于定位網(wǎng)頁中的元素(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,用法示例:
  1. from selenium.webdriver.common.by import By  
  2.   
  3. driver.find_element(By.XPATH, '//button[text()="Some text"]')  
  4. driver.find_elements(By.XPATH, '//button')  
       這些都是通過類可獲取的屬性:
  1. ID = "id"  
  2. XPATH = "xpath"  
  3. LINK_TEXT = "link text"  
  4. PARTIAL_LINK_TEXT = "partial link text"  
  5. NAME = "name"  
  6. TAG_NAME = "tag name"  
  7. CLASS_NAME = "class name"  
  8. CSS_SELECTOR = "css selector"  

1 Locating By Id

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

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

2 Locating By Name

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

  1. <html>  
  2.  <body>  
  3.   <form id="loginForm">  
  4.    <input name="username" type="text" />  
  5.    <input name="password" type="password" />  
  6.    <input name="continue" type="submit" value="Login" />  
  7.    <input name="continue" type="button" value="Clear" />  
  8.   </form>  
  9. </body>  
  10. <html>  
        定位username&password元素方法如下:
  1. username = driver.find_element_by_name('username')  
  2. password = driver.find_element_by_name('password')  
        在"Clear"按鈕之前會給出"Login"登錄按鈕:
  1. continue = driver.find_element_by_name('continue')  

3 Locating By XPath


        XPath是用于定位XML文檔中節(jié)點的語言。正如HTML可以是XML(XHTML)的一個實現(xiàn),Selenium用戶可以利用這個強大的語言來跟蹤Web應(yīng)用程序中的元素。XPath擴展已經(jīng)超出(以及支持)了按照id或name屬性定位的簡單方法,并開發(fā)了各種新的可能,如定位頁面上的第三個復(fù)選框(checkbox)。
        其中使用XPath的一個主要原因是:當(dāng)你沒有一個合適的ID或Name屬性來定位你需要查找的元素時,你可以使用XPath去定位這個絕對元素(不建議這樣),或者相對一個有id或name屬性的元素定位。XPath定位器也可以通過其他不止是id和name屬性進行指定元素。
        絕對XPath包含定位的所有元素,這些元素從根(HTML)到其結(jié)果可能會失敗,只有稍微調(diào)整到應(yīng)用程序。通過找到附近的一個元素的id或name屬性(理想的父元素),你才可以根據(jù)之間的關(guān)系定位到你追蹤的元素。這是不太可能改變的,并且會使你的測試更加的健壯。例如參考下面這段源代碼:

  1. <html>  
  2.  <body>  
  3.   <form id="loginForm">  
  4.    <input name="username" type="text" />  
  5.    <input name="password" type="password" />  
  6.    <input name="continue" type="submit" value="Login" />  
  7.    <input name="continue" type="button" value="Clear" />  
  8.   </form>  
  9. </body>  
  10. <html>  
        這個表單form元素可能通過如下方法被定位:
  1. login_form = driver.find_element_by_xpath("/html/body/form[1]")  
  2. login_form = driver.find_element_by_xpath("http://form[1]")  
  3. login_form = driver.find_element_by_xpath("http://form[@id='loginForm']")  
        [1] 絕對路徑(如果HTML有稍微的改動,就會被破壞)
        [2] 在HTML中的第一個表單元素
        [3] 指定屬性名稱為id且值為loginForm的表單元素
        定位username元素的方法如下:

  1. username = driver.find_element_by_xpath("http://form[input/@name='username']")  
  2. username = driver.find_element_by_xpath("http://form[@id='loginForm']/input[1]")  
  3. username = driver.find_element_by_xpath("http://input[@name='username']")  
        [1] 第一個form元素通過一個input子元素,name屬性和值為username實現(xiàn)
        [2] 通過id=loginForm值的form元素找到第一個input子元素
        [3] 屬性名為name且值為username的第一個input元素
         定位"Clear"按鈕元素的方法如下:

  1. clear_button = driver.find_element_by_xpath("http://input[@name='continue'][@type='button']")  
  2. clear_button = driver.find_element_by_xpath("http://form[@id='loginForm']/input[4]")  
        [1] 屬性名為name其值為continue和屬性名為type其值為button的Input控件
        [2] 屬性id=loginForm的form元素的第四個input子元素
        上面這些例子涉及一些基礎(chǔ)知識,更多詳情請參考下面的建議:

        這里也有幾個非常實用的附加組件,可以幫助發(fā)現(xiàn)元素的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


        當(dāng)你知道一個錨標(biāo)記內(nèi)使用鏈接文本就使用該方法。通過這個策略,第一個匹配這個link text值的元素將被返回。如果沒有元素匹配這個鏈接文本,將拋出一個NoSuchElementException異常。示例的源代碼如下:
  1. <html>  
  2.  <body>  
  3.   <p>Are you sure you want to do this?</p>  
  4.   <a href="continue.html">Continue</a>  
  5.   <a href="cancel.html">Cancel</a>  
  6. </body>  
  7. <html>  
        這個continue.html鏈接定位的方法如下,partial表示部分匹配:
  1. continue_link = driver.find_element_by_link_text('Continue')  
  2. continue_link = driver.find_element_by_partial_link_text('Conti')  


5 Locating Elements By Tag Name


        當(dāng)你想通過tag name(標(biāo)記名)定位一個元素時可以使用該方法。同樣,第一個給出的tag name元素將被返回,如果沒有匹配的標(biāo)記名,將拋出一個NoSuchElementException異常。示例的源代碼如下:
  1. <html>  
  2.  <body>  
  3.   <h1>Welcome</h1>  
  4.   <p>Site content goes here.</p>  
  5. </body>  
  6. <html>  
        定位heading(h1)元素的方法如下:
  1. heading1 = driver.find_element_by_tag_name('h1')  


6 Locating Elements By Class Name


        介紹類似,用于通過類屬性名(class attribute name)進行定位一個元素。示例源代碼如下:
  1. <html>  
  2.  <body>  
  3.   <p class="content">Site content goes here.</p>  
  4. </body>  
  5. <html>  
        其中元素"p"的定位方法如下:
  1. content = driver.find_element_by_class_name('content')  


7 Locating Elements By CSS Selectors


        當(dāng)你想要通過CSS選擇器語法定位一個元素時,可以使用該方法。它將返回第一個與CSS選擇器匹配的元素,如果沒有匹配CSS選擇器的元素,將返回一個NoSuchElementException異常。實例源代碼如下所示:
  1. <html>  
  2.  <body>  
  3.   <p class="content">Site content goes here.</p>  
  4. </body>  
  5. <html>  
        其中元素"p"的定位方法如下:
  1. content = driver.find_element_by_css_selector('p.content')  
        Sauce實驗室有非常好的關(guān)于CSS選擇器的文檔:
           Sauce Labs has good documentation on CSS selectors.

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

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多