天天看點

Python_Selenium使用

目錄

        • 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()