Web自動化測試工具:Selenium

PhantomJs:無頭瀏覽器,支持JavaScript。(即包含Js引擎、瀏覽器排版引擎等核心組件,可是沒有和用戶交互的界面的瀏覽器。)python

Selenium:WEB自動化測試工具。能夠直接運行在瀏覽器中。不一樣瀏覽器提供不一樣的操做接口,Selenium經過這些接口來操做瀏覽器。web

webdriver:Selenium的核心對象。經過它能夠操做瀏覽器、截圖、http訪問、http解析等。macos

 

開發實例1:處理異步請求。在查詢windows

# 獲取bing查詢數據
# 經過異步請求返回結果,因此直接訪問頁面不能獲取到搜索結果。
from selenium import webdriver  # 核心驅動對象
import datetime
import time
import random

# 建立核心對象webdriver
# mac系統下的文件路徑的斜槓與windows下的是相反的
driver = webdriver.PhantomJS(r'phantomjs-2.1.1-macosx/bin/phantomjs')  # 指定PhantomJS的執行文件的路徑
# 設置分辨率
driver.set_window_size(1280, 2400)

# 訪問的url
url = 'https://cn.bing.com/search?q=%E7%8C%AB'
driver.get(url)  # 用get方法打開網頁,模擬瀏覽器地址欄輸入地址

# 截圖:保存圖片
def save_picture():
    base_dir = 'picture/'
    file_name = '{}{:%Y%m%d%H%M%S}{}.png'.format(base_dir, datetime.datetime.now(), random.randint(1, 100))
    driver.save_screenshot(file_name)

# save_picture()  # 訪問太快,會沒來得及加載動態頁面部分

# 方法1:等幾秒至頁面徹底加載出來
# time.sleep(5)
# print('*'*30)
# save_picture()  # 間隔5秒以後再次訪問,就能夠得到徹底加載的頁面內容


# 方法2:在必定的重試次數內找到對應的標籤
MAXRETRYIES = 5  # 最大重試次數

while MAXRETRYIES:
    try:
        ele = driver.find_element_by_class_name('b_caption')  # 找到須要等標籤元素即截圖保存
        print(ele, MAXRETRYIES)
        save_picture()
        break
    except Exception as e:
        print(type(e))  # <class 'selenium.common.exceptions.NoSuchElementException'>
        print(e)  # 捕獲錯誤
    time.sleep(1)  # 暫停一秒等頁面加載。
    MAXRETRYIES -= 1

driver.close()  # 同文件IO,要close

 

 

開發實例2:下拉框處理瀏覽器

from selenium import webdriver
import datetime
import random
from selenium.webdriver.support.ui import Select #獲取有關select的包

driver = webdriver.PhantomJS(r'phantomjs-2.1.1-macosx/bin/phantomjs')  # 指定PhantomJS的執行文件的路徑
driver.set_window_size(1280, 2400)  # 設置窗口大小

# 保存圖片
def save_picture():
    base_dir = 'picture/'
    file_name = '{}{:%Y%m%d%H%M%S}{}.png'.format(base_dir, datetime.datetime.now(), random.randint(1, 100))
    driver.save_screenshot(file_name)

url = "https://www.oschina.net/search?scope=project&q=python"
driver.get(url)  # 用get方法打開網頁,模擬瀏覽器地址欄輸入地址

# 處理select,想選擇tag1的第一項
ele = driver.find_element_by_class_name('tag1')  # 獲取元素
print(ele.tag_name)
print('current_url1:', driver.current_url)
save_picture()

s = Select(ele)  # Select()處理的必定是select下拉框對象
s.select_by_index(1)  # web應用開發
time.sleep(2)

print('current_url2:', driver.current_url)
save_picture()

driver.close()

 

 

開發實例3:模擬鍵盤操做登陸網頁cookie

from selenium import webdriver
import datetime
import time
import random
from selenium.webdriver.common.keys import Keys  # 有關模擬鍵盤輸入的模塊

driver = webdriver.PhantomJS(r'phantomjs-2.1.1-macosx/bin/phantomjs')  # 指定PhantomJS的執行文件的路徑
driver.set_window_size(1280, 2400)  # 設置窗口大小

# 保存圖片
def save_picture():
    base_dir = 'picture/'
    file_name = '{}{:%Y%m%d%H%M%S}{}.png'.format(base_dir, datetime.datetime.now(), random.randint(1, 100))
    driver.save_screenshot(file_name)

url = 'https://www.oschina.net/home/login'
driver.get(url)
print(driver.current_url)  # https://www.oschina.net/home/login
save_picture()

# 獲取郵箱和密碼的2個輸入框對象
email = driver.find_element_by_id('userMail')
pwd = driver.find_element_by_id('userPassword')

# 模擬鍵盤輸入數據
username = '18390900259'
password = '123456'
email.send_keys(username)
pwd.send_keys(password)

print(driver.current_url)  # https://www.oschina.net/home/login
save_picture()

pwd.send_keys(Keys.ENTER)  # 回車=>登陸

time.sleep(1)  # 登陸後頁面會有跳轉
print(driver.current_url)  # https://www.oschina.net/?nocache=1553228140174
save_picture()

while True:  # 循環直到找到對應標籤對象
    time.sleep(1)
    print(driver.current_url)
    try:
        userinfo = driver.find_element_by_class_name('user-info')
        print(userinfo.text)  # 打印該標籤下的文本內容
        save_picture()
        break
    except Exception as e:
        print(e)

cookies = driver.get_cookies()  # 獲取長期登錄的cookie print(cookies)
print(cookies)

driver.close()  # 記得要關閉

 

 

開發實例4:頁面等待dom

愈來愈多的頁面使用Ajax的異步加載技術,會致使頁面中要被訪問的內容還沒加載就被訪問了,代碼拋出異常。異步

方法:工具

1.線程休眠:time.sleep(n)來等待數據加載。1.1:配合循環一直等到數據加載完成;1.2設置最大重試次數,避免一直循環下去。測試

2.Selenium等待:2.1:隱式等待:等待特定時間;2.2:顯式等待:指定一個條件,直到條件成立繼續日後執行。或者設置超時時間,超時拋出異常。

 

2.1隱式等待

from selenium import webdriver  # 頁面隱式等待

driver = webdriver.PhantomJS(r'phantomjs-2.1.1-macosx/bin/phantomjs')
driver.implicitly_wait(10) # 增長這一句,全局設置,會致使下面找元素等待10秒
url = "https://movie.douban.com/"
driver.get(url)
try:
    print('begin-------')
    ele = driver.find_element_by_id('abcde')  # 在這裏查找的時限爲10秒,沒找到跳轉到except裏
except Exception as e:
    print(type(e))  # <class 'selenium.common.exceptions.NoSuchElementException'>
    print(e, '~~~~~~~~~~')
finally:
    driver.quit()

 

 

2.2顯式等待

# 定位搜索框,搜索電影
from selenium import webdriver  # 核心對象
import datetime
import random

# 鍵盤操做
from selenium.webdriver.common.keys import Keys
# WebDriverWait負責循環等待
from selenium.webdriver.support.wait import WebDriverWait
# expected_conditions負責條件觸發
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.common.by import By

driver = webdriver.PhantomJS(r'phantomjs-2.1.1-macosx/bin/phantomjs')
driver.set_window_size(1280, 2400)  # 窗口大小

# 打開網頁,使用get方法
url = 'https://movie.douban.com/'
driver.get(url)

def save_picture():
    base_dir = 'picture/'
    file_name = "{}{:%Y%m%d%H%M%S}{:03}.png".format(base_dir, datetime.datetime.now(), random.randint(1,100))
    driver.save_screenshot(file_name)

    try:
        # 元素是否已加載到dom樹中;使用哪一個driver,等到什麼條件ok,ec就是等待的條件;expected有不少內置條件方法;20秒爲超時時長,超時拋異常,超時時長內在try裏默認0.5秒循環執行
        ele = WebDriverWait(driver, 20).until(
            ec.presence_of_element_located((By.ID, 'inp-query'))
            # ex.presence_of_element_located(By.XPATH, '//input[@id="inp-query]'  # 兩種不一樣的寫法:一個經過id查找元素,一個經過xpath
) ele.send_keys('TRON') # 加載出搜索框後,在搜索框內輸入'TRON',進行搜索 save_picture() ele.send_keys(Keys.ENTER) # 輸入回車鍵,開始搜索 print(driver.current_url) # 查看搜索後跳轉的url save_picture() finally: driver.quit() # 退出瀏覽器

 

 

WebDriver是Selenium的核心, 實現與瀏覽器的交互:打開URL,能夠跟蹤跳轉,能夠返回當前頁面的實際URL 獲取頁面的title;處理cookie 控制瀏覽器的操做,例如前進、後退、刷新、關閉,最大化等 執行JS腳本;在DOM中搜索頁面元素Web Element,指定的或一批,find系方法;操做網頁元素;模擬下拉框操做Select(element) 在元素上模擬鼠標操做click() 在元素上模擬鍵盤輸入send_keys() 獲取元素文字 text;獲取元素的屬性 get_attribute() 等等。
相關文章
相關標籤/搜索