目錄
-
-
-
- Selenium(from selenium import webdriver)
-
- 1、安裝
- 2、基本使用
- 3、聲明浏覽器對象
- 4、通路頁面
- 5、查找節點
- 6、節點互動
- 7、動作鍊
- 8、執行JavaScript
- 9、擷取節點資訊
- 10、切換Frame
- 11、延時等待
- 12、前進與後退
- 13、Cookies
- 14、頁籤管理
- 15、異常處理
- 16、其他浏覽器退出
- 17、截圖
-
-
Selenium(from selenium import webdriver)
- 更詳細的操作見: selenium操作文檔
- Selenium使用手冊
1、安裝
- 安裝步驟1:pip install selenium
Python_Selenium使用 - 安裝步驟2:安裝與計算機上的浏覽器版本對應的浏覽器驅動版本,Chrome(ChromeDriver與浏覽器對應的版本),Firefox(GeckoDriver最新版本即可),解壓後将路徑添加到系統環境變量中
2、基本使用
- Selenium是一個自動化測試工具,利用它可以驅動浏覽器執行特定的動作,如點選、下拉等操作,同時還可以擷取浏覽器目前呈現的頁面的源代碼,做到可見即可爬。
- 以下代碼運作:會自動彈出一個Chrome浏覽器。浏覽器首先會跳轉到百度,然後在搜尋框中輸入Python,接着就會跳轉到搜尋結果頁。
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") # get()方法請求網頁
input_item = browser.find_element_by_id('kw')# 查找百度搜尋框節點
input_item.send_keys('Python') # 輸入文字
input_item.send_keys(Keys.ENTER)
wait = WebDriverWait(browser, 10) # 顯式等待,指定加載等待最長時間
wait.until(ec.presence_of_element_located((By.ID, 'content_left'))) # 代表節點出現的意思
print(browser.current_url) # 輸出目前URL
print(browser.get_cookies) # 輸出目前Cookies
print(browser.page_source) # 輸出網頁源代碼
finally:
browser.quit() # 關閉浏覽器
3、聲明浏覽器對象
- 以下代碼完成了浏覽器對象的初始化并将其指派為browser對象,接下來就是調用browser對象,讓其執行各個動作以模拟浏覽器操作
from selenium import webdriver
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()
4、通路頁面
- get():請求網頁;參數:傳傳入連結接URL
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.taobao.com') # get()方法請求網頁
print(browser.page_source) # 列印出源代碼
browser.quit() # 關閉浏覽器
5、查找節點
- (1)find_element():查找單個節點,傳回的是WebElement類型;所有方法如下表,其中方法1和方法2是等價的,但方法2需要導庫方可使用:from selenium.webdriver.common.by import By:
方法1 | 方法2 |
---|---|
find_element_by_id() | find_element(By.ID,) |
find_element_by_name() | find_element(By.NAME,) |
find_element_by_xpath() | find_element(By.XPATH,) |
find_element_by_link_text() | find_element(By.LINK_TEXT,) |
find_element_by_partial_link_text() | find_element(By.PARTIAL_LINK_TEXT,) |
find_element_by_tag_name() | find_element(By.TAG_NAME,) |
find_element_by_class_name() | find_element(By.CLASS_NAME,) |
find_element_by_css_selector() | find_element(By.CSS_SELECTOR,) |
-
(1) 查找單個節點例子:如下代碼使用3種方式擷取輸入框,分别是ID/CSS選擇器/XPath,它們傳回的結果一緻。
browser.find_element(By.ID,‘q’)等價于
input_first = browser.find_element_by_id(‘q’)
from selenium import webdriver
# from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
# input_first = browser.find_element(By.ID,'q')
input_first = browser.find_element_by_id('q') # 根據ID擷取
input_second = browser.find_element_by_css_selector(' # q') # 根據CSS選擇器擷取
input_third = browser.find_element_by_xpath('//*[@id="q"]') # 根據Xpath擷取
print(input_first)
print(input_second)
print(input_third)
browser.close()
#運作結果:
#<selenium.webdriver.remote.webelement.WebElement (session="618e4d10b4878e40cdbf554ac311600d", element="0.3372975861474088-1")>
#<selenium.webdriver.remote.webelement.WebElement (session="618e4d10b4878e40cdbf554ac311600d", element="0.3372975861474088-1")>
#<selenium.webdriver.remote.webelement.WebElement (session="618e4d10b4878e40cdbf554ac311600d", element="0.3372975861474088-1")>
- (2)find_elements():查找多個節點方法如下:
方法1 | 方法2 |
---|---|
find_elements_by_id() | find_elements(By.ID,) |
find_elements_by_name() | find_elements(By.NAME,) |
find_elements_by_xpath() | find_elements(By.XPATH,) |
find_elements_by_link_text() | find_elements(By.LINK_TEXT,) |
find_elements_by_partial_link_text() | find_elements(By.PARTIAL_LINK_TEXT,) |
find_elements_by_tag_name() | find_elements(By.TAG_NAME,) |
find_elements_by_class_name() | find_elements(By.CLASS_NAME,) |
find_elements_by_css_selector() | find_elements(By.CSS_SELECTOR,) |
- (2)查找多個節點例子,傳回的是清單類型,清單中的每個節點都是WebElement類型:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
lis = browser.find_elements_by_css_selector('.service-bd li')
print(lis)
browser.close()
6、節點互動
- Selenium驅動浏覽器執行一些動作,比較常見的方法有:
- send_keys():輸入文字方法
- clear():清空文字
- click():點選按鈕
- 更多操作見:文檔
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
browser = webdriver.Chrome()
browser.get("https://www.taobao.com")
input_item = browser.find_element(By.ID, 'q') # 擷取輸入框
input_item.send_keys('iPhone') # 輸入文字
time.sleep(1)
input_item.clear() # 清空文字
input_item.send_keys('iPad')
button = browser.find_element(By.CLASS_NAME, 'btn-search') # 擷取搜尋按鈕
button.click() # 點選按鈕
browser.close()
7、動作鍊
- 上面執行個體中,一些互動動作都是針對某個節點執行的。比如:對于輸入框,我們就調用它的輸入文字和清空文字方法;對于按鈕,就調用它的點選方法。其實,還有另外一些操作,它們沒有特定的執行對象,比如滑鼠拖拽、鍵盤按鍵燈,這些動作用另一種方式來執行,那就是動作鍊。
- 實作節點拖拽操作,将某個節點從一處拖拽到另外一處,
- -更多操作見:文檔
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')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser) # 聲明ActionChains對象,并将其指派為actions變量
actions.drag_and_drop(source, target)
actions.perform()
# 解釋:首先,打開網頁中的一個拖拽執行個體,然後依次選中要拖拽的節點和拖拽到的目标節點,接着聲明ActionChains對象并将其指派為actions變量,然後通過調用actions變量的drag_and_drop()方法,再調用perform()方法執行動作,此時就完成了拖拽操作
8、執行JavaScript
- execute_script():可以直接模拟運作JavaScript,比如下拉進度條;基本上API沒有提供的所有功能都可以用執行JavaScript的方式來實作;
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.execute_script('alert("To Bottom")') # 将進度條下拉到最底部,然後彈出alert提示框
9、擷取節點資訊
- (1)page_source屬性可以擷取網頁的源代碼,也可以使用解析庫(如正規表達式、BeautifulSoup、pyquery等)來提取資訊
- (2)Selenium已經提供了選擇節點的方法,傳回的是WebElement類型,那麼它也有相關的方法和屬性來直接提取節點資訊,如屬性、文本等。這樣的話,我們就可以不用通過解析源代碼來提取資訊了,非常友善。
- (2)get_attribute():擷取節點的屬性,但是其前提是先選中這個節點,示例如下:
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')) # 擷取屬性
# 運作結果:
# <selenium.webdriver.remote.webelement.WebElement (session="443b6d01e40e71a44ca68db090f83460", element="0.6351879991034697-1")>
# zu-top-link-logo
- (2).text:擷取文本值,每個WebElement節點都有text屬性,直接調用這個屬性就可以得到節點内部的文本資訊,示例如下:
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.text) # 擷取文本值
# 運作結果:
# 提問
- (2).id .location .tag_name .size;id屬性可以擷取節點id,location屬性擷取節點在頁面中的相對位置,tag_name屬性可以擷取标簽名稱,size屬性可以擷取節點大小,也就是寬高,示例如下:
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) # 擷取節點id
print(input.location) # 擷取該節點在頁面中相對位置
print(input.tag_name) # 擷取标簽名稱
print(input.size) # 擷取節點大小
# 運作結果:
# 0.9816205696610512-1
# {'x': 758, 'y': 7}
# button
# {'height': 32, 'width': 66}
10、切換Frame
- switch_to.frame():擷取子Frame裡面的節點,子Frame相當于頁面的子頁面
import time
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')
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)
# NO LOGO
# <selenium.webdriver.remote.webelement.WebElement (session="f937bd0cfe18c16040c91d18450b754c", element="0.3997722652889779-2")>
# RUNOOB.COM
11、延時等待
- 在selenium中,get()方法會在網頁架構加載結束後結束執行,此時如果擷取page_source,可能并不是浏覽器完全加載完成的頁面,如果某些頁面有額外的Ajax請求,我們在網頁源代碼中也不一定能成功擷取到。是以,這裡需要延時等待一定時間,確定節點已經加載出來。
- 等待的方式有兩種:一種是隐式等待,一種是顯式等待。
- 隐式等待implicily_wait():當使用隐式等待執行測試的時候,如果selenium沒有在DOM中找到節點,将繼續等待,超出設定時間後,則抛出找不到節點的異常。換句話說,當查找節點而節點并沒有立即出現的時候。隐式等待将等待一段時間再查找DOM,預設的時間是0。示例如下:
from selenium import webdriver
browser = webdriver.Chrome()
browser.implicitly_wait(10)
browser.get('http://www.zhihu.com/explore')
input = browser.find_element_by_class_name('zu-top-add-question')
print(input)
# 運作結果:
# <selenium.webdriver.remote.webelement.WebElement (session="e5c098be220c423b28fa0a26534821f1", element="0.12832245097008865-1")>
- 顯式等待wait = WebDriverWait(browser,10),隐式等待的效果其實并沒有那麼好,因為我們隻規定了一個固定的時間,而頁面加載時間會受到網絡條件的影響。這裡還有一種更合适的顯式等待方法,它指定要查找的節點,然後指定一個最長等待時間。如果在規定時間内加載出來了這個節點,就傳回查找的節點;如果到了規定時間依然沒有加載出該節點,則抛出超市異常。示例如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait 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)
print(button)
# 運作結果
# <selenium.webdriver.remote.webelement.WebElement (session="7876fe90bff06066f71e76b32d8997aa", element="0.9458091009175342-1")>
# <selenium.webdriver.remote.webelement.WebElement (session="7876fe90bff06066f71e76b32d8997aa", element="0.9458091009175342-2")>
# 解釋:這裡首先引入了WebDriverWait這個對象,指定最長等待時間,然後調用它的Until()方法,傳入要等待條件expected_conditions。
# 比如,這裡傳入了presence_of_element_located這個條件,代表節點出現意思,其參數是節點的定位元組,也就是ID為q的節點搜尋框。
# 這樣可以做到的效果就是,在10秒内如果ID為q的節點(即搜尋框)成功加載出來,就傳回該節點;如果超過10秒還沒有加載出來,就抛出異常
# 對于按鈕,可以更改一下等待條件,比如改為element_to_be_clickable,也就是可點選,是以查找按鈕是查找CSS選擇器為.btn-search的按鈕,如果10秒内它是可點選的,也就是成功加載出來了,就傳回這個按鈕節點;如果超過10秒還不可點選,也就是沒有加載出來,就抛出異常。
- 等待條件及其含義:參考官方文檔
等待條件 | 含義 |
---|---|
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 | 加載并切換 |
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 | 是否出現警告 |
12、前進與後退
- back():後退
- forward():前進
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
browser.get('https://www.taobao.com/')
browser.get('https://www.zhihu.com/')
browser.back()
time.sleep(1)
browser.forward()
browser.close()
13、Cookies
- get_cookies():擷取cookies
- add_cookie():添加cookie
- delete_all_cookies():删除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())
# 運作結果
# [{'domain': '.zhihu.com', 'httpOnly': False, 'name': 'l_n_c', 'path': '/', 'secure': False, 'value': '1'}, {'domain': 'www.zhihu.com', 'expiry': 1554003614.905896, 'httpOnly': False, 'name': 'tgw_l7_route', 'path': '/', 'secure': False, 'value': 'a37704a413efa26cf3f23813004f1a3b'}, {'domain': '.zhihu.com', 'expiry': 1648610714.905946, 'httpOnly': False, 'name': 'q_c1', 'path': '/', 'secure': False, 'value': 'e87308b5d9a84bcdb918f94638911718|1554002714000|1554002714000'}, {'domain': 'www.zhihu.com', 'httpOnly': False, 'name': '_xsrf', 'path': '/', 'secure': False, 'value': 'ac8081b936d04d7ce1119608047eb0ee'}, {'domain': '.zhihu.com', 'expiry': 1556594714.905979, 'httpOnly': False, 'name': 'r_cap_id', 'path': '/', 'secure': False, 'value': '"MjUzMTU5OTI3ZGFiNDkxOGJkMDEwOWYwN2MwYzU2NzY=|1554002714|f89bec3ebd6cb64efd48b3455de4903ae8f87ff7"'}, {'domain': '.zhihu.com', 'expiry': 1556594714.906004, 'httpOnly': False, 'name': 'cap_id', 'path': '/', 'secure': False, 'value': '"YTU4ZWU2MmVhNThiNDI3MmFhOGFmNTkwNzc5NTczMjE=|1554002714|9356efee24068ce6ecba8e66d4b2ba4dacc59b78"'}, {'domain': '.zhihu.com', 'expiry': 1556594714.906027, 'httpOnly': False, 'name': 'l_cap_id', 'path': '/', 'secure': False, 'value': '"Y2Y3NTBiYTk2MDI2NDEzMWJmZjQzMGUyZmZlYWUxNDI=|1554002714|ba74e0784fa2cb42d3acf482f45ad69414c06dde"'}, {'domain': '.zhihu.com', 'httpOnly': False, 'name': 'n_c', 'path': '/', 'secure': False, 'value': '1'}, {'domain': '.zhihu.com', 'expiry': 1648610716.890978, 'httpOnly': False, 'name': 'd_c0', 'path': '/', 'secure': False, 'value': '"AACnZJWFNA-PTnwYBa3m9gf3fKwMTE92eCA=|1554002716"'}, {'domain': '.zhihu.com', 'expiry': 1617074717, 'httpOnly': False, 'name': '_zap', 'path': '/', 'secure': False, 'value': 'f458e0c8-f536-43a9-9136-d7deba07ff63'}, {'domain': '.zhihu.com', 'expiry': 1617074717, 'httpOnly': False, 'name': '__utma', 'path': '/', 'secure': False, 'value': '51854390.523501187.1554002717.1554002717.1554002717.1'}, {'domain': '.zhihu.com', 'expiry': 1554004517, 'httpOnly': False, 'name': '__utmb', 'path': '/', 'secure': False, 'value': '51854390.0.10.1554002717'}, {'domain': '.zhihu.com', 'httpOnly': False, 'name': '__utmc', 'path': '/', 'secure': False, 'value': '51854390'}, {'domain': '.zhihu.com', 'expiry': 1569770717, 'httpOnly': False, 'name': '__utmz', 'path': '/', 'secure': False, 'value': '51854390.1554002717.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)'}, {'domain': '.zhihu.com', 'expiry': 1617074717, 'httpOnly': False, 'name': '__utmv', 'path': '/', 'secure': False, 'value': '51854390.000--|3=entry_date=20190331=1'}]
# [{'domain': '.zhihu.com', 'httpOnly': False, 'name': 'l_n_c', 'path': '/', 'secure': False, 'value': '1'}, {'domain': 'www.zhihu.com', 'expiry': 1554003614.905896, 'httpOnly': False, 'name': 'tgw_l7_route', 'path': '/', 'secure': False, 'value': 'a37704a413efa26cf3f23813004f1a3b'}, {'domain': '.zhihu.com', 'expiry': 1648610714.905946, 'httpOnly': False, 'name': 'q_c1', 'path': '/', 'secure': False, 'value': 'e87308b5d9a84bcdb918f94638911718|1554002714000|1554002714000'}, {'domain': 'www.zhihu.com', 'httpOnly': False, 'name': '_xsrf', 'path': '/', 'secure': False, 'value': 'ac8081b936d04d7ce1119608047eb0ee'}, {'domain': '.zhihu.com', 'expiry': 1556594714.905979, 'httpOnly': False, 'name': 'r_cap_id', 'path': '/', 'secure': False, 'value': '"MjUzMTU5OTI3ZGFiNDkxOGJkMDEwOWYwN2MwYzU2NzY=|1554002714|f89bec3ebd6cb64efd48b3455de4903ae8f87ff7"'}, {'domain': '.zhihu.com', 'expiry': 1556594714.906004, 'httpOnly': False, 'name': 'cap_id', 'path': '/', 'secure': False, 'value': '"YTU4ZWU2MmVhNThiNDI3MmFhOGFmNTkwNzc5NTczMjE=|1554002714|9356efee24068ce6ecba8e66d4b2ba4dacc59b78"'}, {'domain': '.zhihu.com', 'expiry': 1556594714.906027, 'httpOnly': False, 'name': 'l_cap_id', 'path': '/', 'secure': False, 'value': '"Y2Y3NTBiYTk2MDI2NDEzMWJmZjQzMGUyZmZlYWUxNDI=|1554002714|ba74e0784fa2cb42d3acf482f45ad69414c06dde"'}, {'domain': '.zhihu.com', 'httpOnly': False, 'name': 'n_c', 'path': '/', 'secure': False, 'value': '1'}, {'domain': '.zhihu.com', 'expiry': 1648610716.890978, 'httpOnly': False, 'name': 'd_c0', 'path': '/', 'secure': False, 'value': '"AACnZJWFNA-PTnwYBa3m9gf3fKwMTE92eCA=|1554002716"'}, {'domain': '.zhihu.com', 'expiry': 1617074717, 'httpOnly': False, 'name': '_zap', 'path': '/', 'secure': False, 'value': 'f458e0c8-f536-43a9-9136-d7deba07ff63'}, {'domain': '.zhihu.com', 'expiry': 1617074717, 'httpOnly': False, 'name': '__utma', 'path': '/', 'secure': False, 'value': '51854390.523501187.1554002717.1554002717.1554002717.1'}, {'domain': '.zhihu.com', 'expiry': 1554004517, 'httpOnly': False, 'name': '__utmb', 'path': '/', 'secure': False, 'value': '51854390.0.10.1554002717'}, {'domain': '.zhihu.com', 'httpOnly': False, 'name': '__utmc', 'path': '/', 'secure': False, 'value': '51854390'}, {'domain': '.zhihu.com', 'expiry': 1569770717, 'httpOnly': False, 'name': '__utmz', 'path': '/', 'secure': False, 'value': '51854390.1554002717.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)'}, {'domain': '.zhihu.com', 'expiry': 1617074717, 'httpOnly': False, 'name': '__utmv', 'path': '/', 'secure': False, 'value': '51854390.000--|3=entry_date=20190331=1'}, {'domain': 'www.zhihu.com', 'expiry': 2184722717, 'httpOnly': False, 'name': 'name', 'path': '/', 'secure': True, 'value': 'germey'}]
# []
14、頁籤管理
- 在通路網頁的時候,會開啟一個頁籤。在Selenium中,我們可以對頁籤進行操作,執行個體如下:
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
# 調用execute_script()方法,傳入window.open()這個javascript語句新開啟一個頁籤
browser.execute_script('window.open()')
# 擷取目前開啟的所有頁籤,傳回的是頁籤的代号清單
print(browser.window_handles)
# 調用switch_to.window()方法切換頁籤,參數是頁籤代号,跳轉到第二個頁籤
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')
# 運作結果:
# ['CDwindow-84D5CA52848B2EE81B74BCAE18EE7D2B', 'CDwindow-17F0406037F745152EF0DF4937DA74F7']
15、異常處理
- 在使用Selenium的過程中,難免會遇到一些異常,例如逾時、節點未找到等錯誤,一旦出現此類錯誤,程式便不會繼續運作了。用try except語句來捕獲各種異常。
- 更多異常類參考:https://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions
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()
# 運作結果
# No Element
16、其他浏覽器退出
- browser.close():關閉浏覽器的一個标簽頁
- browser.quit():關閉浏覽器
- linux環境下截屏需要安裝中文庫,否則中文字會全部顯示方框
17、截圖
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.support.wait import WebDriverWait
import random
import logging
def selenium_screenshot(url, css_element: str, width, height):
"""
快照截圖
:param url: url
:param width: 視窗寬度
:param height:
:param css_element: css定位
:return:
"""
ua = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101Firefox/50.0"
driver = ""
ip = "xxx.xxx.xxx.xxx"
try:
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument(f'user-agent={ua}')
chrome_options.add_argument(f'--proxy-server=http://{ip}:port"')
driver = webdriver.Chrome(options=chrome_options)
driver.maximize_window()
if width:
driver.set_window_size(width, height)
driver.get(url)
wait = WebDriverWait(driver, 10)
wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, css_element)))
ele = driver.find_element_by_css_selector(css_element)
except Exception as err:
logging.warning(f"{url} selenium_screenshot false: {err} ")
return
else:
save_file_path = f"{random.random()}.png"
ele.screenshot(save_file_path)
logging.info(f"selenium_screenshot success {url}")
return save_file_path
finally:
if driver:
driver.quit()