Selenium自動化釋出話題(Python實現)
折騰了一下自動化測試,找到了阿里開源的一個 uirecorder ,可以自動錄製測試過程,但自定義邏輯有些麻煩
然後發現這貨是基於 selenium 實現的,於是就開始折騰起了 selenium,弄出了個小成果,記錄一下並分享給有需要的人
老規矩,先上圖
安裝
pip install selenium
開啟瀏覽器
先下載 chromedriver 下載地址: http://chromedriver.chromium.org/
下載好後解壓,建立一個資料夾,名為: selenium-dmeo
你也可以命名成其它名字,將 chromedriver拷貝進去,然後建立一個py檔案,我這裡命名為 main.py
from selenium import webdriver if __name__ == "__main__": browser = webdriver.Chrome("./chromedriver") browser.set_window_size(1024, 768) browser.get('https://demo.yiiu.co/') browser.quit()
這樣就可以開啟一個瀏覽器,然後在瀏覽器裡開啟網址:https://demo.yiiu.co/
獲取元素並觸發點選事件
selenium裡獲取元素的方法有很多個,如下
我這裡主要使用兩個方法 find_element_by_id
find_element_by_xpath
為啥要用這兩個方法呢? find_element_by_id
不用說,可以根據id獲取唯一的元素,很準確,至於 find_element_by_xpath
是因為chrome瀏覽器裡在審查元素裡可以 copy Xpath
也很方便
獲取到元素肯定要點選了,點選方法也很好實現,如下
from selenium.webdriver.common.keys import Keys .send_keys(Keys.ENTER)
from selenium import webdriver from selenium.webdriver.common.keys import Keys if __name__ == "__main__": browser = webdriver.Chrome("./chromedriver") browser.set_window_size(1024, 768) browser.get('https://demo.yiiu.co/') # 等待Body標籤加載出來 WebDriverWait(driver=browser, timeout=30, poll_frequency=0.5)\ .until(EC.presence_of_element_located((By.TAG_NAME, 'body'))) # 通過xpath路徑獲取到登入A標籤然後點選 browser.find_element_by_xpath('//*[@id="bs-example-navbar-collapse-1"]/ul[2]/li[2]/a')\ .send_keys(Keys.ENTER)
獲取到元素就可以取元素上的值了,比如一個A標籤的文字和連結,如下
topicAElement = browser.find_element_by_xpath('/html/body/div/div/div/div[1]/div/div[2]/div[1]/div[2]/div/a') text = topicAElement.get_attribute('text') href = topicAElement.get_attribute('href') print(text, href) browser.quit() # 列印結果 # 第一篇話題 https://demo.yiiu.co/topic/51
操作form表單
上一步可以獲取到元素的物件了,也可以獲取到元素上的資訊了,那怎麼給元素設定值呢,比如往表單裡設定自定義的值
還是使用 .send_keys()
方法,用法如下
from selenium import webdriver from selenium.webdriver.common.keys import Keys if __name__ == "__main__": browser = webdriver.Chrome("./chromedriver") browser.set_window_size(1024, 768) browser.get('https://demo.yiiu.co/') # 等待Body標籤加載出來 WebDriverWait(driver=browser, timeout=30, poll_frequency=0.5)\ .until(EC.presence_of_element_located((By.TAG_NAME, 'body'))) browser.find_element_by_xpath('//*[@id="bs-example-navbar-collapse-1"]/ul[2]/li[2]/a')\ .send_keys(Keys.ENTER) time.sleep(.5) # 等待Body標籤加載出來 WebDriverWait(driver=browser, timeout=30, poll_frequency=0.5) \ .until(EC.presence_of_element_located((By.TAG_NAME, 'body'))) # 設定登入使用者名稱 browser.find_element_by_id('username').send_keys("tomoya92") time.sleep(.5) # 設定登入密碼 browser.find_element_by_id('password').send_keys("aa123123") time.sleep(.5) # 點選登入按鈕 browser.find_element_by_id('login_btn').send_keys(Keys.ENTER) time.sleep(2) browser.quit()
等待頁面載入
等待頁面載入的方法網上有很多文章介紹,我覺得直接等待下一步要操作的元素加載出來後,就可以操作了,這個比較實用,下面就介紹一下這個用法
匯入依賴
from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By
用法
WebDriverWait(driver=browser, timeout=30, poll_frequency=0.5) \ .until(EC.presence_of_element_located((By.TAG_NAME, 'body')))
說明:
WebDriverWait() 方法的引數
browser = webdriver.Chrome("./chromedriver")
until() 方法引數裡的 presence_of_element_located()
方法裡的引數是一個元組,不要寫錯了,外面是有一層 ()
的,元組裡也有多種判斷寫法,可以通過TAG_NAME, XPATH, CSS_SELECTOR等判斷
另外就是系統提供的time庫用來在兩種操作中間等待一下,比如上面填寫登入使用者名稱和密碼之間就睡眠了0.5s,這樣可以方便除錯 time.sleep(.5)
滑鼠點選事件
有些輸入框,比如上面開啟的網站裡釋出話題的內容輸入框,用的就是 codemirror ,直接找到 textarea 的id填值是沒有效果的,這時候滑鼠操作就派上用場了
首先還是匯入依賴 from selenium.webdriver.common.action_chains import ActionChains
用法如下
# 內容輸入框使用的是codeMirror,這裡再使用簡單的獲取textarea的id然後sendKeys是不行的,所以這裡使用了滑鼠點選事件來輸入資料 contentElement = browser.find_element_by_xpath('//*[@id="form"]/div[2]/div/div[6]') # 鏈式呼叫,最後通過 `perform()` 方法來觸發依次執行前面定義好的執行過程 ActionChains(driver=browser).click(contentElement).send_keys("hello world").perform()
擴充套件
通過 selenium 可以自定義對網站操作的動作,這利用空間的太大了,網站防爬也就更難了,專案上線之間也可以通過自己編寫指令碼跑一遍,防止一些錯誤出現
另外還可以結合資料庫或者Excel等實現自動化發帖,爬取網站資料等操作,即使是JS渲染的網站也不怕了,是不是很爽
原文連結: