1. 程式人生 > >Selenium用法筆記(解決動態渲染頁面)

Selenium用法筆記(解決動態渲染頁面)

Selenium庫,主要用來做自動化測試,爬蟲中用來解決JavaScript渲染的問題

需要安裝selenium庫,以及瀏覽器的驅動(Chrome瀏覽器安裝ChromeDriver)

一、基本使用

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

browser = webdriver.Chrome()#宣告瀏覽器物件
try:
    browser.get('https://www.baidu.com')#開啟頁面
    input = browser.find_element_by_id('kw')#根據ID找到對應的標籤,這裡是輸入框
    input.send_keys('Python')             #輸入文字
    input.send_keys(Keys.ENTER)            #模擬回車
    wait = WebDriverWait(browser, 10)      #建立一個等待10秒的物件
    wait.until(EC.presence_of_element_located((By.ID, 'content_left')))    #等待直到某個標籤加載出來
    print(browser.current_url)
    print(browser.get_cookies())
    print(browser.page_source)
finally:
    browser.close()

二、宣告瀏覽器物件(需要安裝相應瀏覽器的驅動)

from selenium import webdriver

browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()

三、查詢元素

單個元素

例子:獲取淘寶輸入框
在這裡插入圖片描述

from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.taobao.com')

input_1 = browser.find_element_by_id('q')
input_2 = browser.find_element_by_css_selector('#q')
input_3 = browser.find_element_by_class_name('search-combobox-input')
print(input_1)
print(input_2)
print(input_3)

還有很多方法供使用

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

多個元素,使用方法一樣

find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector

四、元素互動操作

最常用的就是對輸入框,按鈕進行操作

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(1)
input.clear()
input.send_keys('iPad')
button = browser.find_element_by_class_name('btn-search')
button.click()

互動動作,動作鏈

-模擬拖拽動作

API資料

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')                     #切換到內部的iframe框架
source = browser.find_element_by_css_selector('#draggable') #選擇源
target = browser.find_element_by_css_selector('#droppable') #選擇目標
print(source,target)
actions = ActionChains(browser)                             #建立動作鏈物件
actions.drag_and_drop(source, target)                       #設計動作
###重點
actions.perform()#開始你的表演

五、執行JavaScript

from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")')

六、獲取元素資訊(屬性,文字,位置,大小等)

獲取屬性

from selenium import webdriver

browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
logo = browser.find_element_by_id('zh-top-link-logo')
print(logo)
print(logo.get_attribute('class'))

獲取文字

input = browser.find_element_by_class_name('zu-top-add-question')
print(input.text)

獲取ID,位置,標籤名,大小

print(input.id)
print(input.location)
print(input.size)
print(input.tag_name)
----------------------------------------------------------------------------------
0.6052552682324703-2
{'x': 759, 'y': 7}
{'height': 32, 'width': 66}
button

七、對Frame框架的處理

有時候一個網頁會鑲嵌一個iframe框架,獲取裡面的東西需要進入這個框架

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException

browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')                     #進入一個框架,輸入框架的ID
source = browser.find_element_by_css_selector('#draggable')
print(source)
try:
    logo = browser.find_element_by_class_name('logo')#在子框架中獲取不到父框架的標籤
except NoSuchElementException:
    print('NO LOGO')
browser.switch_to.parent_frame()                            #進入父框架
logo = browser.find_element_by_class_name('logo')
print(logo)
print(logo.text)

八、等待,等待某些需要的東西載入完成(基本就是根據網速看他全部載入完成)

隱式等待

當使用了隱式等待執行測試的時候,如果 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)

顯式等待

#顯式等待
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)
  • 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

相關API

前進後退

import time
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
browser.get('https://www.taobao.com/')
browser.back()
time.sleep(1)
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': 'germey'})
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()')             #通過執行JavaScript來開啟一個選項卡,通用方式
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://www.taobao.com')

異常處理

會出現各種各樣的異常,找不到元素,載入不出來,無法點選等

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 NoSuchElementException:
    print('No Element')
finally:
    browser.close()

相關推薦

Selenium用法筆記解決動態渲染頁面

Selenium庫,主要用來做自動化測試,爬蟲中用來解決JavaScript渲染的問題 需要安裝selenium庫,以及瀏覽器的驅動(Chrome瀏覽器安裝ChromeDriver) 一、基本使用

【Python3 爬蟲學習筆記動態渲染頁面爬取 4 —— 使用Selenium爬取淘寶商品

並不是所有頁面都可以通過分析Ajax來完成抓取。比如,淘寶,它的整個頁面資料確實也是通過Ajax獲取的,但是這些Ajax介面引數比較複雜,可能會包含加密祕鑰等,所以如果想自己構造Ajax引數,還是比較困難的。對於這種頁面,最方便快捷的抓取方法就是通過Seleni

【Python3 爬蟲學習筆記動態渲染頁面爬取 3 —— Selenium的使用 3

切換Frame 網頁中有一種節點叫作iframe,也就是子Frame,相當於頁面的子頁面,它的結構和外部頁面的結構完全一致。Selenium開啟頁面後,它預設是在父級Frame裡面操作,而此時如果頁面中海油子Frame,它是不能獲取到子Frame裡面的額節點的。

【Python3 爬蟲學習筆記動態渲染頁面爬取 2

動作鏈 在互動操作中,一些互動動作都是針對某個節點執行的。比如,對於輸入框,我們就呼叫它的輸入文字和清空文字方法;對於按鈕,就呼叫它的點選方法。其實,還有另外一些操作,它們沒有特定的執行物件,比如滑鼠拖曳、鍵盤按鍵等,這些動作用另一種方式來執行,那就是動作鏈。

python動態渲染頁面的爬取--使用Selenium

2018年4月26日 10:05 一、安裝相關包和軟體 1、安裝Selenium包 Pip3 install Selenium 2、安裝chromedriver 訪問chromedriver映象站,下載對應版本的chromedriver,例如我

scrapy+selenium+chromedriver解析動態渲染頁面

wait tab rim 增加 encoding war 互動 ogg @class 背景:動態頁面是頁面是通過js代碼渲染出來的,無法直接使用scrapy爬蟲,這是就需要先把js代碼轉為靜態的html,再用scrapy爬蟲就可以解決 解決辦法:增加SeleniumMid

selenium+python自動化84-chrome手機wap模式登入淘寶頁面

selenium+python自動化84-chrome手機wap模式(登入淘寶頁面) 前言 遇到的問題 Chrome手機模式 TouchAction 參考程式碼 附: 轉載自: https://w

Python web 動態渲染頁面的抓取

通過直接分析ajax資訊,我們仍然可以利用request或者urllib來獲取資訊,但是,JavaScript動態渲染頁面的方式不僅只有ajax一種,也不是傳統的html頁面資訊,運用模擬瀏覽器的執行方式來獲取資訊,只要瀏覽器能接收到,我們就能獲取出來.在 Python 中提供了許多模擬瀏覽器執行的

微信小程式 修改資料,並動態渲染頁面;修改陣列;

一、修改資料,並在頁面動態渲染   this.setData({     txt: '12112'   }) 二、修改陣列 var rotateClassItem = 'rotateClass['+ index + ']'; t

【程式碼】第7章 動態渲染頁面爬取

7.1 selenium from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import

metisMenu.js動態側邊導航的實現ajax動態渲染部分導航

  使用metisMenu.js實現後臺管理系統的導航,通過點選導航,切換不同的頁面內容。有些時候。我們需要動態新增頁面的內容,即通過ajax請求後臺來渲染部分導航的內容。 第一部分是靜態導航的實現,即通過點選導航切換右側頁面的實現。第二部分是動態渲染導航的實現。(demo例子

Web自動化測試Selenium 學習筆記

1、Web自動化測試簡介自動化基礎:自動化用例編寫、Selenium優勢及原理、自動化環境搭建Selenium基礎:常見8大元素定位(表格)、常見元素處理、下拉框元素處理、不同視窗切換、元素進階、元素等待需求到框架    需求分析-用例設計-基礎指令碼-登入/購物指令碼重構-

selenium學習筆記3——常用的方法

from selenium import webdriver import time path = 'D:\\Chrome下載\\chromedriver_win32/chromedriver.exe' driver = webdriver.Chrome(path)

Class 17 - 2 動態渲染頁面爬取 — Splash

一、Splash 的使用 Splash 是一個JavaScript 渲染服務,帶有 HTTP API的輕量級瀏覽器,同時對接了 Python 中的 Twisted 和 QT 庫。利用它,同樣可以實現動態渲染頁面的抓取。 例項引入 通過 Splash 提供的 Web 頁面來測試其渲染過

多選本地相簿中的圖片並展示仿QQ空間動態傳送頁面上傳至伺服器

最近公司專案需要從本地上傳圖片到伺服器,直接去找才發現安卓居然還有這麼坑的時候,呼叫原生的只能選擇一張圖片,而且還沒有任何的細節優化,觸控圖片就直接返回了。這肯定不行啊!於是就在網上找啊找。。。找啊找。。。有很多都寫得花裡胡哨的看不懂,而且介面的UI也是low的不行。。終於

scrapy 爬取 javscript 動態渲染頁面

load 簡單 下午 net xpath 列表 find 一個 data 前言 初因是給寶寶制作拼音卡點讀包時,要下載賣家提供給的MP3,大概有2百多個。作為一個會碼代碼的非專業人士,怎麽可能取一個一個下載?所以就決定用python 的 scrapy 框架寫個爬蟲,去下載這

Android菜鳥學習筆記WebView載入html頁面頁面提交資料問題

在開發過程中,有一個問卷調查功能,問卷是url用webView載入html頁面出來,在html頁面提交時發現session沒和webview的同步導致提交失敗,這個問題困擾了我很久,後來在前輩的共同研究下,終於找到辦法:獲取html頁面提交的url,然後對url做一次coo

Selenium學習筆記——Selenium Grid

什麼是Selenium Grid Selenium Grid是Selenium專門用於在不同瀏覽器、作業系統和機器上並行執行的元件。 Selenium Grid使用hub-nodes的結構,你可以在hub上啟動測試,不過測試則會在不同的機器node上執行。

RabbitMQ基礎學習筆記C#代碼示例

esp 輸出 出隊 csharp 實例代碼 為什麽 mode 規則 無需 一、定義: MQ是MessageQueue,消息隊列的簡稱(是流行的開源消息隊列系統,利用erlang語言開發)。MQ是一種應用程序對應用程序的通信方法。應用程序通過讀寫入隊和出隊的消息來通信

Json.net實現方便的Json轉C#dynamic動態類型對象

bar 方便 api lba c# oid tool 可能 情況 以前需要將一段json字符串轉換為C#對象時,一般都是定義一個與之對應的實體類來接收。這樣做有一個很大的缺點,就是當字符串特別長,屬性特別多,又有嵌套時,手敲這個實體類就非常痛苦。 比如之前做的一個接收百度七