學習筆記之selenium模塊篇

  Selenium 是什麼?一句話,自動化測試工具。它支持各種瀏覽器,包括 Chrome,Safari,Firefox 等主流界面式瀏覽器,如果你在這些瀏覽器裏面安裝一個 Selenium 的插件,那麼便可以方便地實現Web界面的測試。換句話說叫 Selenium 支持這些瀏覽器驅動


Selenium支持多種語言開發,比如 Java,C,Ruby,Python等等

#一個簡單的小例子
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

browser = webdriver.Chrome()          #打開Chrom瀏覽器
browser.get('http://www.baidu.com')      #輸入百度的網址   即打開百度
input = browser.find_element_by_id('kw')   #找到id=kw 即百度搜索輸入框
#input = browser.find_element(By.ID,'kw')      #同上
input.send_keys('Python')           #在搜索輸入框中輸入Python
input.send_keys(Keys.ENTER)           #鍵入回車

#用例: 聲明瀏覽器對象

#未安裝則報錯

    browser = webdriver.Chrome()

    browser = webdriver.Firefox()

    browser = webdriver.Edge()

    browser = webdriver.PhantomJS()

    browser = webdriver.Safari()


查找元素

WebDriver 提供了許多尋找網頁元素的方法,譬如 find_element_by_* 的方法。例如一個輸入框可以通過  find_element_by_name 方法尋找 name 屬性來確定。

對應於webdriver中的定位方法分別是:
driver.find_element_by_name()         ——最常用,簡單
driver.find_element_by_id()           ——最常用,簡單
driver.find_element_by_class_name()
driver.find_element_by_tag_name()     ——最不靠譜
driver.find_element_by_link_text()    ——定位文字連接好用
driver.find_element_by_partial_link_text()  ——定位文字連接好用
driver.find_element_by_xpath()        ——最靈活,萬能
driver.find_element_by_css_selector()

#這裏的方法都可以寫做 driver.find_element(by.___,'__ ')的方法  
例如:driver.find_element(By.ID,'q') 
這裏需要調用 from selenium.webdriver.common.by import By 模塊

注意:上邊的都爲單個元素的查找方法,若想查詢多個元素需要將 element 換成 elements


prowser.page_source   #獲取網頁渲染後的代碼。這樣就可以做到網頁的動態爬取了。


元素交互操作

#一個簡單的例子
from selenium import webdriver
import time

browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input = browser.find_element_by_id('q')
input.send_keys('iPhone')
time.sleep(3)
input.clear()              #清除輸入框
input.send_keys('iPad')
button = browser.find_element_by_class_name('btn-search')
button.click()


元素拖拽


要完成元素的拖拽,首先你需要指定被拖動的元素和拖動目標元素,然後利用 ActionChains 類來實現


from selenium import webdriver
from selenium.webdriver import ActionChains

browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')  #找到id=draggable
target = browser.find_element_by_css_selector('#droppable')  #找到id=droppable
actions = ActionChains(browser)
actions.drag_and_drop(source,target)
actions.perform()



這樣就實現了元素從 source 拖動到 target 的操作。


執行JS 實現進度條下拉

from selenium import webdriver
import time

browser = webdriver.Chrome()

browser.get('https://www.zhihu.com/explore')
element = browser.find_element_by_name('fullname')
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)') #移動到頁面最底部
time.sleep(5)
#移動到元素element對象的“頂端”與當前窗口的“頂部”對齊  
browser.execute_script("arguments[0].scrollIntoView();",element)
time.sleep(5)
browser.execute_script("window.scrollBy(0, 100)")   #移動到指定的座標(相對當前的座標移動) 
time.sleep(5)
browser.execute_script("window.scrollTo(0, 500)")   #移動到窗口絕對位置座標,如下移動到縱座標1600像素位置
time.sleep(5)
browser.execute_script("arguments[0].scrollIntoView(true)", element)
time.sleep(5)
#移動到元素element對象的“底端”與當前窗口的“底部”對齊  
browser.execute_script("arguments[0].scrollIntoView(false)", element)
time.sleep(5)
browser.execute_script("window.scrollTo(0, 0);")  #頁面最頂端
browser.execute_script('alert("To Bottom")')       #跳出警告框


獲取ID,位置,標籤名,大小,html代碼

from selenium import webdriver

browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.id)
print(input.location)
print(input.tag_name)
print(input.size)             
print(browser.page_source)    #獲取渲染後的html代碼



等待操作


# 爬蟲在執行的過程中,目標站可能會有一些ajax請求,它不會管你的頁面是否加載成功(完全)

# 當頁面加載不完全時,執行ajax可能就會報錯,以導致程序出錯, 所以我們需要使用等待操作

    

# 隱式等待: 當使用了隱式等待執行測試的時候,如果WebDriver沒有在DOM中找到元素,將繼續等待,

# 超出設定時間後則拋出找不到元素的異常,也就是說,當查找元素或元素並沒有立即出現時,

# 隱式等待將等待一段時間再查找DOM,默認的時間是 0

#隱形操作

from selenium import webdriver

browser = webdriver.Chrome()
browser.implicitly_wait(10)
browser.get('https://www.zhihu.com/explore')
input = browser.find_element_by_class_name('zu-top-add-question')
print(input)
browser.close()
# 顯式等待(比較常用)
# 在指定時間內,判斷條件是否成立, 如果成立立即返回
# 如果不成立,就會一直等待, 如果仍不滿足條件, 拋出異常
# 用例:
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

browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
wait = WebDriverWait(browser, 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)
browser.close()


一些判斷條件

# 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


瀏覽器控制


import time
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.get('https://www.taobao.com')
browser.get('https://python.org')
browser.back()  #後退
time.sleep(2)
browser.forward()
browser.close()


插入cookies

from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())
browser.add_cookie({'name':'name','domain':'www.zhihu.com','value':'jim'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())


標籤頁管理

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(2)
browser.switch_to_window(browser.window_handles[0])
browser.get('https://www.python.org')


異常處理

# 異常處理:
#   在瀏覽器中的異常處理是比較麻煩的,因爲瀏覽器可能觸發的異常是非常多的
#   比如說,某個元素無法點擊的異常, 加載超時的異常, 某個元素的執行異常等等
#   這裏用了簡單的例子來說明異常
#   這裏還是建議要讀官方的文檔.

# 用例: selenium 異常處理
from selenium import webdriver
from selenium.common.exceptions import TimeoutException,NoSuchElementException

browser = webdriver.Chrome()
try:
    browser.get('https://www.baidu.com')
except TimeoutException:
    print('Time Out!!')
try:
    browser.find_element_by_id('hello')
except NoSuchElemention:
    print('No Element')
finally:
    browser.close()


小白筆記 如有錯誤  請提醒修改

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章