python+selenium實現(xiàn)登錄賬戶后自動點擊的示例
公司在codereview的時候限制了看代碼的時間,實際上不少代碼屬于框架自動生成,并不需要花費太多時間看,為了達標,需要刷點時間(鼠標點擊網(wǎng)頁固定區(qū)域)。我想到可以利用自動化測試的手段完成這種無效的體力勞動。
首先,明確一下需求:
- 自動打開網(wǎng)頁
- 登陸賬號
- 每隔一定時間點擊一下固定區(qū)域
我想到的方案有兩個,sikuli或者python+selenium。sikuli的優(yōu)點是邏輯操作簡單直接,使用圖片作為標示,缺點是需要窗口固定,并且無法后臺運行。selenium稍復雜一定,但是運行速度快,窗口可以遮擋。
這里簡單記錄一下使用Python+selenium的小例子。
使用的版本為Python3.3以及selenium2,Windows環(huán)境(現(xiàn)在已經(jīng)支持3.0以上的了,多處論壇博客沒有更新)。
首先是軟件的安裝,Python不贅述了,記得設(shè)置環(huán)境變量。
下面安裝selenium,如果已經(jīng)安裝過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
安裝過程中可能會出現(xiàn)ImportError: No module named setuptools,這是因為缺少setuptools模塊,Python默認不安裝。
在http://pypi.python.org/pypi/setuptools上面提供了各系統(tǒng)的安裝包和安裝指南,對于Windows系統(tǒng),下載https://bootstrap.pypa.io/ez_setup.py自動化安裝腳本。
運行:
python ez_setup.py
完成后再安裝selenium即可。
這里用我自己的實例簡單的講解一下流程。
第一步先完成打開瀏覽器。
selenium2結(jié)合了selenium和webdriver,直接引入各個瀏覽器相應(yīng)的驅(qū)動,打開即可,注意chrome驅(qū)動可能需要另行安裝。
from selenium import webdriver browser = webdriver.Firefox() browser.get('https://www.xxx.com')
打開網(wǎng)頁后需要登錄,F(xiàn)12打開瀏覽器調(diào)試器,小箭頭選取元素,查看登錄框賬號和密碼的屬性,一般都有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最為有效方便,優(yōu)先考慮。選取完元素之后可以通過WebDriver API調(diào)用模擬鍵盤的輸入和鼠標的點擊操作。代碼如下:
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()
一般登錄之后頁面都會跳轉(zhuǎn)到新的網(wǎng)頁上,如何獲取新的網(wǎng)頁呢?這里有個窗口句柄的概念,通過切換窗口句柄來完成。注意!有時候元素在一個frame里面的時候,也需要通過swtich切換。這里出現(xiàn)一個wait函數(shù)(上面也有),是因為頁面加載需要時間,很可能在點擊之后元素才加載出來,下一節(jié)詳細解釋一下wait。
browser.implicitly_wait(10) browser.switch_to_window(browser.window_handles[-1])
之后選取需要點擊的區(qū)域,這里使用 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("http://input[@name='username']") clear_button = browser.find_element_by_xpath("http://form[@id='loginForm']/input[4]")
代碼如下,網(wǎng)上經(jīng)常出現(xiàn)的By的用法需要引入包。
from selenium.webdriver.common.by import By
這里使用另外一個函數(shù),我不知道有什么區(qū)別- -。
for i in range(100): elem=WebDriverWait(browser, 30).until( lambda x:x.find_element_by_xpath("http://table[@class='aaa']"/td[1])) elem.click() time.sleep(20) print ("click",i)
然后這里還要提一下wait函數(shù),在selenium2中延遲等待分為兩種,顯示等待和隱式等待。
顯示等待
顯式等待,就是明確的要等到某個元素的出現(xiàn)或者是某個元素的可點擊等條件,等不到,就一直等,除非在規(guī)定的時間之內(nèi)都沒找到,那么就跳出Exception。
element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "myDynamicElement")) )
隱式等待
注意,隱式等待是告訴設(shè)置所有dom元素在尋找某個元素的時候,如果沒立即找到,再嘗試這么長時間。
browser.implicitly_wait(10) # seconds
兩者的區(qū)別在于一個是自己直接管理超時對象,一個是交給webdriver去做。
當然也可以用休眠的方法干等。記得引入time包。
time.sleep(20)
這里只是簡單的演示一下用法,有許多可以改進的地方,沒有封裝函數(shù),么有使用多線程并發(fā)執(zhí)行多個例程。以后有需求再改進。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- python+opencv+selenium自動化登錄郵箱并解決滑動驗證的問題
- python爬蟲之利用selenium模塊自動登錄CSDN
- Python如何基于selenium實現(xiàn)自動登錄博客園
- Selenium+Python 自動化操控登錄界面實例(有簡單驗證碼圖片校驗)
- selenium+python實現(xiàn)自動化登錄的方法
- Python使用selenium實現(xiàn)網(wǎng)頁用戶名 密碼 驗證碼自動登錄功能
- python內(nèi)置函數(shù)frozenset()的使用小結(jié)
- selenium+python實現(xiàn)自動登錄腳本
- Python用selenium實現(xiàn)自動登錄和下單的項目實戰(zhàn)
相關(guān)文章
Pycharm終端顯示PS而不顯示虛擬環(huán)境名的解決
這篇文章主要介紹了Pycharm終端顯示PS而不顯示虛擬環(huán)境名的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06