python+selenium實現登錄賬戶後自動點擊

  公司在codereview的時候限制了看代碼的時間,實際上不少代碼屬於框架自動生成,並不需要花費太多時間看,爲了達標,需要刷點時間(鼠標點擊網頁固定區域)。我想到可以利用自動化測試的手段完成這種無效的體力勞動。

  首先,明確一下需求:   

  • 自動打開網頁   
  • 登陸賬號 
  • 每隔一定時間點擊一下固定區域

我想到的方案有兩個,sikuli或者python+selenium。sikuli的優點是邏輯操作簡單直接,使用圖片作爲標示,缺點是需要窗口固定,並且無法後臺運行。selenium稍複雜一定,但是運行速度快,窗口可以遮擋。

  這裏簡單記錄一下使用Python+selenium的小例子。
使用的版本爲Python3.3以及selenium2,Windows環境(現在已經支持3.0以上的了,多處論壇博客沒有更新)。
  首先是軟件的安裝,Python不贅述了,記得設置環境變量。
  下面安裝selenium,如果已經安裝過pip。直接運行一下命令。

     pip install -U selenium

  另一種方式,https://pypi.python.org/packages/source/s/selenium/selenium-2.52.0.tar.gz下載並解壓。這裏簡述一下windows版本,其實Unix下也差不多,使用Wget下載一下安裝。
  使用命令(setup一般用於第三方模塊的安裝):

  cd c:\Python3\xxxx
  python setup.py install

  安裝過程中可能會出現ImportError: No module named setuptools,這是因爲缺少setuptools模塊,Python默認不安裝。
  在http://pypi.python.org/pypi/setuptools上面提供了各系統的安裝包和安裝指南,對於Windows系統,下載https://bootstrap.pypa.io/ez_setup.py自動化安裝腳本。
  運行:
  

python ez_setup.py

  完成後再安裝selenium即可。
  如果你對selenium沒有概念或者有其他疑問,可以參考文檔。
  http://selenium-python.readthedocs.org/en/latest/installation.html
  這裏用我自己的實例簡單的講解一下流程。
  第一步先完成打開瀏覽器。
  selenium2結合了selenium和webdriver,直接引入各個瀏覽器相應的驅動,打開即可,注意chrome驅動可能需要另行安裝。

  from selenium import webdriver
  browser = webdriver.Firefox()
  browser.get('https://www.xxx.com')

  打開網頁後需要登錄,F12打開瀏覽器調試器,小箭頭選取元素,查看登錄框賬號和密碼的屬性,一般都有ID。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

    其中id最爲有效方便,優先考慮。選取完元素之後可以通過WebDriver API調用模擬鍵盤的輸入和鼠標的點擊操作。代碼如下:

username="qun" 
passwd="passwd"
browser = webdriver.Firefox()
browser.get('https://www.xxx.com')
browser.implicitly_wait(10)
elem=browser.find_element_by_id("loginFormUserName")
elem.send_keys(username)
elem=browser.find_element_by_id("loginFormPassword")
elem.send_keys(passwd)
elem=browser.find_element_by_id("loginFormSubmit")
elem.click()

  一般登錄之後頁面都會跳轉到新的網頁上,如何獲取新的網頁呢?這裏有個窗口句柄的概念,通過切換窗口句柄來完成。注意!有時候元素在一個frame裏面的時候,也需要通過swtich切換。這裏出現一個wait函數(上面也有),是因爲頁面加載需要時間,很可能在點擊之後元素才加載出來,下一節詳細解釋一下wait。

browser.implicitly_wait(10)
browser.switch_to_window(browser.window_handles[-1])

  之後選取需要點擊的區域,這裏使用 xpath定位,因爲在自動化測試的過程中,很有可能元素無法通過id,name等方法定位(不少人就是不寫,愛table套table,我也麼辦法),xpath就有了用武之地。常用的偷懶方法是Firefox安裝xpath插件,右鍵直接獲取。這裏不介紹,因爲不提倡,使用插件會造成代碼裏充斥這樣的東西:
  

XPath(/html/body/div/div[3]/div[2]/div[4]/p[2])

  不到萬不得已,儘可能使用元素的特徵來定位,比如按鈕的name。
或者通過父元素定位子元素。

 username =browser.find_element_by_xpath("//input[@name='username']")
 clear_button = browser.find_element_by_xpath("//form[@id='loginForm']/input[4]")

  代碼如下,網上經常出現的By的用法需要引入包。

from selenium.webdriver.common.by import By

  這裏使用另外一個函數,我不知道有什麼區別- -。

for i in range(100):
    elem=WebDriverWait(browser, 30).until(
        lambda x:x.find_element_by_xpath("//table[@class='aaa']"/td[1]))
    elem.click()
    time.sleep(20)
    print ("click",i)

  
  然後這裏還要提一下wait函數,在selenium2中延遲等待分爲兩種,顯示等待和隱式等待。
  

  1. 顯示等待

      顯式等待,就是明確的要等到某個元素的出現或者是某個元素的可點擊等條件,等不到,就一直等,除非在規定的時間之內都沒找到,那麼就跳出Exception。

      element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
  1. 隱式等待
      注意,隱式等待是告訴設置所有dom元素在尋找某個元素的時候,如果沒立即找到,再嘗試這麼長時間。
      
browser.implicitly_wait(10) # seconds

  兩者的區別在於一個是自己直接管理超時對象,一個是交給webdriver去做。
  當然也可以用休眠的方法乾等。記得引入time包。

   time.sleep(20)

  這裏只是簡單的演示一下用法,有許多可以改進的地方,沒有封裝函數,麼有使用多線程併發執行多個例程。以後有需求再改進。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章