selenium和phantomjs的介紹
selenium
Selenium是一個用於Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。支持的瀏覽器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等主流瀏覽器。這個工具的主要功能包括:測試與瀏覽器的兼容性——測試你的應用程序看是否能夠很好得工作在不同瀏覽器和操作系統之上。
它的功能有:
- 框架底層使用JavaScript模擬真實用戶對瀏覽器進行操作。測試腳本執行時,瀏覽器自動按照腳本代碼做出點擊,輸入,打開,驗證等操作,就像真實用戶所做的一樣,從終端用戶的角度測試應用程序。
- 使瀏覽器兼容性測試自動化成為可能,盡管在不同的瀏覽器上依然有細微的差別。
- 使用簡單,可使用Java,Python等多種語言編寫用例腳本
也就是說,它可以根據指令,做出像真實的人在訪問瀏覽器一樣的動作,比如打開網頁,截圖等功能。
phantomjs
(新版本的selenium已經開始棄用phantomjs, 不過有時候我們可以單獨用它做一些事情)
是一個基於Webkit的無界面瀏覽器,可以把網站內容加載到內存中並執行頁面上的各種腳本(比如js)。
官網下載地址: http://phantomjs.org/download.html
安裝
其實該軟件是可以免安裝的,Mac、linux、windows直接將可執行文件放入到環境變量目錄即可。同時,如果配合selenium一起使用,創建瀏覽器對象的時候,可以直接通過參數指定文件路徑即可。
br = webdriver.PhantomJS('./phantomjs.exe')
br.get('http://www.baidu.com')
br.save_screenshot('2.png')
selenium應用篇
安裝
pip install selenium -i https://pypi.douban.com/simple/
如果需要正常驅動瀏覽器,比如chrome,那么我們需要安裝相對應的驅動才能進行操作。我們可以去網上搜索驅動安裝,也可以直接去淘寶的npm
源中找到(http://npm.taobao.org),比如我們接下來要用的chromedriver,下載地址:https://npm.taobao.org/mirrors/chromedriver,一般這些下載的地方都會提供不同操作系統的版本的軟件,選擇對應系統的和瀏覽器對應的最新版本即可。Mac和Linux版本的下載解壓后,將二進制可執行文件放到對應的環境變量目錄即可(比如:/usr/local/bin
)。windows版可以直接把chromedriver.exe放到要運行的python文件所在目錄,也可以將chromedriver.exe的路徑添加到環境變量path中。
快速上手
from selenium import webdriver
import time
# 獲取一個瀏覽器對象
br = webdriver.Chrome()
# 打開一個頁面
br.get('http://www.baidu.com')
# 獲取頁面的源代碼(運行后在內存中渲染的頁面元素)
print(br.page_source)
# 根據id查找元素
kw = br.find_element_by_id('kw')
# 往表單輸入框中輸入內容
kw.send_keys('你好')
# 點擊某個元素
br.find_element_by_id('su').click()
time.sleep(3)
# 將頁面內容保存成截圖
br.save_screenshot('./1.png')
# 設置窗口最大化
br.maximize_window()
time.sleep(2)
# 指定瀏覽器窗口大小
br.set_window_size(1200, 800)
# 設置瀏覽器的坐標 四個參數分別是 x坐標 y坐標 窗口的寬 框框的高
br.set_window_rect(100, 200, 300, 500)
# 獲取所有cookie
print(br.get_cookies())
print('*' * 10)
# 獲取某一個cookie的信息
print(br.get_cookie('BDORZ'))
time.sleep(2)
# 關閉窗口
br.close()
# 退出瀏覽器
time.sleep(2)
br.quit()
元素對象操作
查找(定位)單個元素(查詢符合條件的第一個元素)
# 根據類名查找元素
br.find_element_by_class_name('s_btn')
# 根據元素的name值查找元素
br.find_element_by_name('ie')
# 根據元素的標簽名稱查找元素
br.find_element_by_tag_name('div')
# 根據鏈接包裹着的文字查找
br.find_element_by_link_text('地圖')
# 根據鏈接包裹着的部分文字查找
br.find_element_by_partial_link_text('地')
# 根據css選擇器規則進行查找元素
br.find_element_by_css_selector('#wrapper')
# 根據xpath規則進行查找元素
find_element_by_xpath('//*[@id="q"]')
多元素查找(定位)
所謂多元素查找其實就是查詢符合規則的所有元素,使用方法上和單元素查找一樣,只是方法名和返回值有所區別
方法名的區別:多元素是以find_elements
開頭的 ,單個元素是find_element
開頭的。
比如:
# 獲取所有的a標簽元素, 使用的時候可以遍歷返回值使用
br.find_elements_by_tag_name('a')
獲取元素對象的屬性
元素對象.get_attribute('屬性名')
獲取元素對象的文本內容
元素對象.text
交互動作
頁面元素的交互動作
我們前面在快速上手部分已經使用了幾個交互動作了,比如send_keys
、click
等,其實常用的還有clear
(清空輸入框的內容)
瀏覽器的屬性和動作
除了快速上手部分我們看到的操作瀏覽器本身的屬性和方法外,還有不少:
運行JavaScript
br.execute_script('alert(111)')
Frame
有些時候,我們的網頁中會嵌入iframe
,如果我們需要操作iframe
里面的內容的話,就需要我們先切換的iframe
中
常用的方法有:switch_to.frame()
和switch_to.parent_frame()
等待
當使用了隱式等待執行測試的時候,如果WebDriver沒有在DOM中找到元素,將繼續等待,超出設定時間后則拋出找不到元素的異常, 換句話說,當查找元素或元素並沒有立即出現的時候,隱式等待將等待一段時間再查找 DOM,默認的時間是0
隱式等待
到了一定的時間發現元素還沒有加載,則繼續等待我們指定的時間,如果超過了我們指定的時間還沒有加載就會拋出異常,如果沒有需要等待的時候就已經加載完畢就會立即執行。
br = webdriver.Chrome()
# 設置最長等待10秒
br.implicitly_wait(10)
顯式等待 (選學)
指定一個等待條件,並且指定一個最長等待時間,會在這個時間內進行判斷是否滿足等待條件,如果成立就會立即返回,如果不成立,就會一直等待,直到等待你指定的最長等待時間,如果還是不滿足,就會拋出異常,如果滿足了就會正常返回
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
br = webdriver.Chrome()
br.get('https://www.taobao.com/')
wait = WebDriverWait(br, 10)
input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
print(input, button)
上述的例子中的條件:EC.presence_of_element_located()是確認元素是否已經出現了
EC.element_to_be_clickable()是確認元素是否是可點擊的
常用的判斷條件:
title_is
標題是某內容
title_contains
標題包含某內容
presence_of_element_located
元素加載出,傳入定位元組,如(By.ID, 'p')
visibility_of_element_located
元素可見,傳入定位元組
visibility_of
可見,傳入元素對象
presence_of_all_elements_located
所有元素加載出
text_to_be_present_in_element
某個元素文本包含某文字
text_to_be_present_in_element_value
某個元素值包含某文字
frame_to_be_available_and_switch_to_it
frame加載並切換
invisibility_of_element_located
元素不可見
element_to_be_clickable
元素可點擊
staleness_of
判斷一個元素是否仍在DOM,可判斷頁面是否已經刷新
element_to_be_selected
元素可選擇,傳元素對象
element_located_to_be_selected
元素可選擇,傳入定位元組
element_selection_state_to_be
傳入元素對象以及狀態,相等返回True,否則返回False
element_located_selection_state_to_be
傳入定位元組以及狀態,相等返回True,否則返回False
alert_is_present
是否出現Alert
cookie 操作
get_cookies()
get_cookie('鍵名')
delete_all_cookes()
delete_cookie(鍵名)
add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'zhaofan'})
選項卡管理
通過執行js命令實現新開選項卡window.open()
不同的選項卡是存在列表里br.window_handles
通過br.window_handles[0]
就可以操作第一個選項卡
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.execute_script('window.open()')
print(browser.window_handles)
browser.switch_to_window(browser.window_handles[1])
browser.get('https://www.taobao.com')
time.sleep(1)
browser.switch_to_window(browser.window_handles[0])
browser.get('https://python.org')
chrome 無界面瀏覽器
我們在前面的學習中會發現,PhantomJS已經不被新版本的Selenium棄用了,同時我們前面一直使用的是有界面的瀏覽器,但是它運行的時候,很影響我們去干其它事情,不用怕,其實chrome和火狐都提供的有無界模式。只需要傳入一些參數即可
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 配置chrome的參數
options = Options()
options.add_argument('--headless')
# options.add_argument('--disable-gpu')
# 獲取一個瀏覽器對象
br = webdriver.Chrome(chrome_options=options)