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


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

  首先,明確一下需求:   

自動打開網頁   
登陸賬號 
每隔一定時間點擊一下固定區域
我想到的方案有兩個,sikuli或者python+selenium。sikuli的優點是邏輯操作簡單直接,使用圖片作為標示,缺點是需要窗口固定,並且無法后台運行。selenium稍復雜一定,但是運行速度快,窗口可以遮擋。

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

pip install -U selenium
1
  另一種方式,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
1
2
  安裝過程中可能會出現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
1
  完成后再安裝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')
1
2
3
  打開網頁后需要登錄,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()
1
2
3
4
5
6
7
8
9
10
11
  一般登錄之后頁面都會跳轉到新的網頁上,如何獲取新的網頁呢?這里有個窗口句柄的概念,通過切換窗口句柄來完成。注意!有時候元素在一個frame里面的時候,也需要通過swtich切換。這里出現一個wait函數(上面也有),是因為頁面加載需要時間,很可能在點擊之后元素才加載出來,下一節詳細解釋一下wait。

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

XPath(/html/body/div/div[3]/div[2]/div[4]/p[2])
1
  不到萬不得已,盡可能使用元素的特征來定位,比如按鈕的name。
或者通過父元素定位子元素。

 username =browser.find_element_by_xpath("//input[@name='username']")
 clear_button = browser.find_element_by_xpath("//form[@id='loginForm']/input[4]")
1
2
  代碼如下,網上經常出現的By的用法需要引入包。

from selenium.webdriver.common.by import By
1
  這里使用另外一個函數,我不知道有什么區別- -。

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)
1
2
3
4
5
6
  
  然后這里還要提一下wait函數,在selenium2中延遲等待分為兩種,顯示等待和隱式等待。
  

顯示等待

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

   element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
1
2
3
隱式等待
  注意,隱式等待是告訴設置所有dom元素在尋找某個元素的時候,如果沒立即找到,再嘗試這么長時間。
  
browser.implicitly_wait(10) # seconds
1
  兩者的區別在於一個是自己直接管理超時對象,一個是交給webdriver去做。
  當然也可以用休眠的方法干等。記得引入time包。

  time.sleep(20)
1
  這里只是簡單的演示一下用法,有許多可以改進的地方,沒有封裝函數,么有使用多線程並發執行多個例程。以后有需求再改進。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM