Ajax其實也是JavaScript動態渲染的頁面的一種情形,不過JavaScript 動態渲染的頁面不止Ajax 這一種: 比如中國青年網(詳見 http://news.youth.cn/gn/ ), 它的分頁部分是由 JavaScript 生成的,并非原始 HTML代碼,這其中并不包含 Ajax 請求, 比如 ECharts 的官方實體(詳見 http: //echarts.baidu.com/demo.html#bar-negative ),其圖形都是經過 JavaScript 計算之后生成的, 再有淘寶這種頁面,它即使是Ajax 獲取的資料,但是其 Ajax 介面含有很多加密引數,我 一一 們難以直接找出其規律,也很難直接分析 Ajax 來抓取,
為了解決這些問題,我們可以直接使用模擬瀏覽器運行的方式來實作, 這樣就可以做到在瀏覽器 中看到是什么樣,抓取的原始碼就是什么樣,也就是可見即可爬,這樣我們就不用再去管網頁內部的 JavaScript用了什么演算法渲染頁面,不用管網頁后臺的A jax 介面到底有哪些引數.
Python 提供了許多模擬瀏覽器運行的庫,如 Selenium、 Splash、 PyV8、 Ghost
目錄
1、Selenium使用
1、基本使用
2、宣告瀏覽器物件
3、訪問頁面
4、查找節點
5、節點互動
6、動作鏈
7、執行JavaScript
8、獲取節點資訊
8.1 獲取屬性
8.2 獲取文本值
8.3 獲取ID,位置,標簽名和大小
9、切換Frame
10、延時等待
10.1 隱式等待
10.2 顯示等待
11、前進和后退
12、Cookies操作
13、選項卡管理
14、捕獲例外
1、Selenium使用
Selenium是一個 自動化測驗工具,利用它可以驅動瀏覽器執行特定的動作,如點擊、下拉等操作, 同時還可以獲取瀏覽器當前呈現的頁面的源代碼 ,做到可見即可爬, 對于一些 JavaScript動態渲染的頁面來說,此種抓取方式非常有效
1、基本使用
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
driver = webdriver.Chrome()
try:
driver.get("http://www.baidu.com")
input = driver.find_element_by_id("kw")
input.send_keys("Python")
input.send_keys(Keys.ENTER)
wait = WebDriverWait(driver,10)
wait.until(EC.presence_of_element_located((By.ID,"content_left")))
print(driver.current_url)
print(driver.get_cookies())
print(driver.page_source)
finally:
driver.close()
運行代碼后,會自動彈出一個Chrome瀏覽器,瀏覽器首先會跳轉到百度,然后再搜索框中輸入Python,接著會跳轉到搜索結果頁面
我們在代碼中列印了當前得到的URL、Cookies和源代碼都是瀏覽器中真是內容,如果用 Selenium來驅動瀏覽器加載網頁的話, 就可以直接拿到JavaScript渲染的結果了, 不用擔心使用的是什么加密系統
2、宣告瀏覽器物件
Selenium支持非常多的瀏覽器,如 Chrome、Firefox、Edge ,還有Android、 BlackBerry 等手機端的瀏覽器, 另外,也支持無界面瀏覽器PhantomJS
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
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver = webdriver.Firefox()
driver = webdriver.Edge()
driver = webdriver.PhantomJS()
driver = webdriver.Safari()
這樣就完成了瀏覽器物件的初始化,并將其賦值為driver物件
3、訪問頁面
使用get() 方法來獲取請求網頁,引數傳入連接URL即可
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
from selenium.webdriver.support.wait import WebDriverWait
browser = webdriver.Chrome()
browser.get("https://www.taobao.com")
print(browser.page_source)
browser.close()
運行后,可彈出Chrome瀏覽器并且自動訪問了淘寶,然后控制臺輸出了淘寶輸出了淘寶頁面的源代碼
4、查找節點
Selenium 可以驅動瀏覽器完成各種操作 ,比如填充表單、模擬點擊等,比如,我們想要完成向某 個輸入框輸文字 的操作,總需要知道這個輸入框在哪里吧?而 Selenium 提供了一系列查找節點的方法,我們可以用這些方法來獲取想要的節點,以便下一步執行一些動作或者提取資訊
4.1 單個節點
從淘寶頁面中提取搜索框這個節點

可以通過他的屬性,id,name來定位到該搜索框
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
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.get("https://www.taobao.com")
input_frist = driver.find_element_by_id('q')
input_seconde = driver.find_element_by_css_selector('#q')
input_third = driver.find_element_by_xpath("//*[@id='q']")
print(input_frist,input_seconde,input_third)
driver.close()
結果:
<selenium.webdriver.remote.webelement.WebElement (session="5ee9c7d62e53891cb8e194cb25c38640", element="1f59fb5a-95be-4abd-a759-db7238d0ed9a")>
<selenium.webdriver.remote.webelement.WebElement (session="5ee9c7d62e53891cb8e194cb25c38640", element="1f59fb5a-95be-4abd-a759-db7238d0ed9a")>
<selenium.webdriver.remote.webelement.WebElement (session="5ee9c7d62e53891cb8e194cb25c38640", element="1f59fb5a-95be-4abd-a759-db7238d0ed9a")>
通過三種方式獲取輸入框,分別是ID,CSS選擇器和XPath獲取,可以看到回傳的結果是完全一致的
其中還包含以下獲取單節點的方法:
driver.find_element_by_xpath()
driver.find_element_by_id()
driver.find_element_by_name()
driver.find_element_by_link_text()
driver.find_element_by_partial_link_text()
driver.find_element_by_tag_name()
driver.find_element_by_class_name()
driver.find_element_by_css_selector()
Selenium還提供了通用方法,find_element() ,它需要傳入兩個引數:查找方式By和值,實際上,他就是find_element_by_id() 這種方法的通用函式版本,比如:find_element_by_id(id) 就等價于find_element(By.ID,id) ,二者得到的結果完全一致,
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
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.get("https://www.taobao.com")
input_frist = driver.find_element(By.ID,'q')
print(input_frist)
driver.close()
結果:
<selenium.webdriver.remote.webelement.WebElement (session="145f28af1f24e5014f87f9e01a4b457d", element="20d4aad6-deb5-4c06-bc6f-98b9dc3ce7df")>
4.2、多個節點
網頁上的目標只要一個,那么可以使用find_element() 方法,但如果有多個節點,再用 find_e lement () 方法查找,就只能得到第一個節點了, 如果要查找所有滿足條件的節點, 需要用 find_elements() 這樣的方法.
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
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.get("https://www.taobao.com")
lis = driver.find_elements_by_css_selector('.service-bd li')
print(lis)
driver.close()
結果:
[<selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="22478f55-3eeb-4d6f-b898-6088ac71a6a7")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="86ba16f6-ceca-4b7e-bf45-c651f4d27830")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="4459a888-ef18-4f09-bb51-b9d389bdcde5")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="a64d6dd2-890d-432d-a0a9-438c6665bcb3")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="5d2e7795-54fe-4b1a-a620-e3041eb37714")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="03d2ba0c-bbf1-4bb3-920c-be447347cfff")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="9afb7a4b-cf1f-492f-a723-329ddf625e3e")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="acd8159a-a93c-4e54-93a7-3bfbbefef422")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="8606a022-3fa7-489d-a2d0-9ad263cf0e7f")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="72e75ae6-e3e1-4650-a9c6-5b52e01d9777")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="625bf2db-2689-4e6f-ba53-aec889de0ddc")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="b609260c-13fc-44d4-9239-fee9eae5b6da")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="6c29f74b-0b3f-413a-860e-cbcd71d2bcec")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="4a169ec3-bdc9-4081-ab35-4e84dabaf19d")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="29b74a5b-498a-4bf7-a2a1-7a451cf64b61")>]
find_element() 方法,只能獲取匹配的第一個節點,結果是WebElement型別,如果用find_elemnts() 方法,則結果是串列形式,串列中每個節點是WebElement型別
這些也是獲取多個節點的方法
driver.find_elements_by_css_selector(
driver.find_elements_by_id()
driver.find_elements_by_name()
driver.find_elements_by_xpath()
driver.find_elements_by_partial_link_
driver.find_elements_by_tag_name()
driver.find_elements_by_class_name()
我們也可以使用find_elements() 方法來選擇
driver.find_elements(By.CSS_SELECTOR,".service-bd li")
5、節點互動
Selenium可以驅動瀏覽器來執行一些操作,也就是說可以讓瀏覽器模擬執行一些動作,比較常見的用法有:輸入文字時用send_keys() 方法,清空文字時用clear() 方法,點擊按鈕時用click() 方法,
import time
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
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.get("https://www.taobao.com")
input = driver.find_element_by_id('q')
input.send_keys("huawei")
time.sleep(2)
input.clear()
input.send_keys("matepad")
button = driver.find_element_by_class_name("btn-search")
button.click()
先定位到輸入框,然后輸入huawei,等待兩秒在清空,在輸入matepad,點擊搜索
6、動作鏈
一些互動動作都是針對某個節點執行的,比如:對于輸入框,我們就呼叫它的輸入文字和清空文字方法;對于按鈕,就呼叫它的點擊方法,其實還有另外一些操作,他們沒有特定的物件,比如滑鼠的拖拽,鍵盤的按鍵等,這些動作用另一種方式來執行,那就是動作鏈
比如:現在實作一個節點的拖拽操作,將某個節點從一處拖拽到另外一處
import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
driver.switch_to.frame("iframeResult")
source = driver.find_element_by_css_selector("#draggable")
target = driver.find_element_by_css_selector("#droppable")
actions = ActionChains(driver)
actions.drag_and_drop(source,target)
actions.perform()
這就是打開一個網頁進行拖拽的節點和拖拽到的目標節點,宣告一個ActionChains物件并將其賦值為actions變數,然后通過呼叫actions變數的drag_and_drop() 方法,在呼叫perform() 方法來進行執行,此時就完成了拖拽
7、執行JavaScript
對于某些操作,Slenium API斌沒有提供,比如,下拉進度條,它可以直接模擬運行JavaScript,此時使用execute_script() 方法就可以實作
import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.get("https://www.zhihu.com/explore")
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
driver.execute_script('alert("To Bottom")')
利用execute_script() 方法將進度跳下拉最底部,然后彈出alert提示框
8、獲取節點資訊
我們可以通過page_source屬性可以獲取網頁的源代碼,接著就可以使用決議庫(如正則運算式,Beautiful Soup,pyquery等)提取資訊
既然 Selenium 已經提供了選擇節點的方法,回傳的是WebElement 型別,那么它也有相關的方法和屬性來直接提取節點資訊,如屬性、文本等 這樣的話,我們就可以不用通過決議源代碼來提取資訊了,非常方便
8.1 獲取屬性
使用 get_attribute() 方法來獲取節點的屬性,但是其前提是先選中這個節點,
import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.get("https://www.zhihu.com/explore")
logo = driver.find_element_by_class_name("ExploreCollectionCard-title")
print(logo)
print(logo.get_attribute("class"))
結果:
<selenium.webdriver.remote.webelement.WebElement (session="96f1ac158a9bad0d06fb32cc21cefda6", element="e8cd6a1a-f663-457a-aa68-426561ee1a17")>
ExploreCollectionCard-title
通過get_attribute() 方法,然后轉入想要獲取的屬性名,就可以得到它的值了
8.2 獲取文本值
每個WebElement節點都有text屬性,直接呼叫這個屬性就可以得到內部的文本資訊,這相當于Beautiful Soup的get_text() 方法,pyquery的text() 方法
import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.get("https://www.zhihu.com/explore")
logo = driver.find_element_by_class_name("ExploreCollectionCard-title")
print(logo)
print(logo.text)
結果:
<selenium.webdriver.remote.webelement.WebElement (session="afd497e9a45395121770946862a30511", element="223964a5-bbe8-4678-9a1e-0fbd901b2885")>
學習提高
8.3 獲取ID,位置,標簽名和大小
WebElemen節點還有一些其他屬性,比如ID屬性可以獲取節點id,location屬性可以獲取該節點在頁面中的相對位置,tag_name屬性可以獲取標簽名稱,size屬性可以獲取節點的大小,也就是寬高,這些屬性有時候還是很有用的
import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.get("https://www.zhihu.com/explore")
logo = driver.find_element_by_class_name("ExploreCollectionCard-title")
print(logo.id)
print(logo.location)
print(logo.tag_name)
print(logo.size)
結果:
0caa35fa-5868-44c6-950d-c8392bdc63a2
{'x': 40, 'y': 3409}
a
{'height': 28, 'width': 320}
9、切換Frame
網頁中有一種節點叫作iframe,也就是子Frame,相當于頁面的子頁面,它的結構和外部網頁的結構完全一致,Selenium打開頁面后,它默認是在父級別Frame里面操作,而此時如果頁面中還有子Frame,它是不能獲取到子Frame里面的節點的,這時就需要使用switch_to.frame() 方法來切換Frame
import time
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
driver.switch_to.frame("iframeResult")
try:
logo = driver.find_element_by_class_name("logo")
except NoSuchElementException:
print("NO LOGO")
driver.switch_to.parent_frame()
logo = driver.find_element_by_class_name("logo")
print(logo)
print(logo.text)
結果:
NO LOGO
<selenium.webdriver.remote.webelement.WebElement (session="97f699231561624df577fc75ece0866e", element="16ea4a07-35f5-426b-aab8-980a86a7d739")>
10、延時等待
在Selenium中,get() 方法會在網頁框架加載結束后結束執行,此時如果獲取page_source,可能并不是瀏覽器完全加載完成的頁面,如果某些頁面有額外的Ajax請求,我們在網頁源代碼中也不一定能成功獲取到,這里就需要延時等待一定時間,確保節點已經加載處理啊
10.1 隱式等待
使用隱式等待執行測驗的時候,如果 Selenium 沒有在DOM中找到節點,將繼續等待,超出設定時間后,則拋出找不到節點的例外, 換句話說,當查找節點而節點并沒有立即出現的時候,隱式等待將等待一段時間再查找DOM ,默認的時間是0
import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.get("https://www.zhihu.com/explore")
driver.implicitly_wait(10)
logo = driver.find_element_by_class_name("ExploreCollectionCard-title")
print(logo)
結果:
<selenium.webdriver.remote.webelement.WebElement (session="0c34ab0ea5b70d42de837dd4eae854e7", element="e5a1e9b3-b7e5-458a-9505-9d7cefeeea49")>
使用implicitly_wait() 方法實作了隱士等待
10.2 顯示等待
import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.ui import WebDriverWait
driver = webdriver.Chrome()
driver.get("https://www.taobao.com/")
wait = WebDriverWait(driver,10)
input = wait.until(EC.presence_of_element_located((By.ID,'q')))
button = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.btn-search')))
print(input,button)
引入WebDriverWait這個物件,指定最長等待時間,然后呼叫until() 方法,傳入要等待條件excpeted_conditions比如:這里傳入presence_of_element_located這個條件,代表節點出現的意思,其引數就是定位節點元組
在10面內如果ID為q的節點(即搜索框)成功加載出來,就回傳該節點,如果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 | 是否出現警告 |
11、前進和后退
平常使用瀏覽器時都有前進和后退功能, Selenium也可以完成這個操作,它使用back() 方法后退, 使用于forward() 方法前進
import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.ui import WebDriverWait
driver = webdriver.Chrome()
driver.get("https://www.taobao.com/")
driver.get('https://www.baidu.com/')
driver.get('https://www.python.org/')
driver.back()
time.sleep(1)
driver.forward()
driver.close()
12、Cookies操作
使用 Selenium ,還可以方便地對 Cookies 進行操作,例如獲取、添加、 洗掉
import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.ui import WebDriverWait
driver = webdriver.Chrome()
driver.get("https://www.taobao.com/")
print(driver.get_cookies())
driver.add_cookie({'name':'domain','domain':'www.taobao.com','value':'germey'})
print(driver.get_cookies())
driver.delete_all_cookies()
print(driver.get_cookies())
結果:
[{'domain': '.taobao.com', 'expiry': 2272113900, 'httpOnly': False, 'name': 'cna', 'path': '/', 'sameSite': 'None', 'secure': True, 'value': '7ZxcGrzqCCgCAXtwEYzGcf5w'}, {'domain': '.taobao.com', 'expiry': 1641998700, 'httpOnly': False, 'name': '_m_h5_tk_enc', 'path': '/', 'sameSite': 'None', 'secure': True, 'value': 'd9e042eff1e4af78a5d1a243ebe5bb2b'}, {'domain': '.taobao.com', 'expiry': 1656945899, 'httpOnly': False, 'name': 'isg', 'path': '/', 'secure': False, 'value': 'BAAA-rPvdRaYsQkShG1T14qB0Y7SieRTxgpiCHqRzJuu9aAfIpm049ZHCFw18pwr'}, {'domain': '.taobao.com', 'expiry': 1641998700, 'httpOnly': False, 'name': '_m_h5_tk', 'path': '/', 'sameSite': 'None', 'secure': True, 'value': '3434eb6af78e421b8a32e6073184148f_1641403980978'}]
[{'domain': '.www.taobao.com', 'httpOnly': False, 'name': 'domain', 'path': '/', 'secure': True, 'value': 'germey'}, {'domain': '.taobao.com', 'expiry': 2272113900, 'httpOnly': False, 'name': 'cna', 'path': '/', 'sameSite': 'None', 'secure': True, 'value': '7ZxcGrzqCCgCAXtwEYzGcf5w'}, {'domain': '.taobao.com', 'expiry': 1641998700, 'httpOnly': False, 'name': '_m_h5_tk_enc', 'path': '/', 'sameSite': 'None', 'secure': True, 'value': 'd9e042eff1e4af78a5d1a243ebe5bb2b'}, {'domain': '.taobao.com', 'expiry': 1656945899, 'httpOnly': False, 'name': 'isg', 'path': '/', 'secure': False, 'value': 'BAAA-rPvdRaYsQkShG1T14qB0Y7SieRTxgpiCHqRzJuu9aAfIpm049ZHCFw18pwr'}, {'domain': '.taobao.com', 'expiry': 1641998700, 'httpOnly': False, 'name': '_m_h5_tk', 'path': '/', 'sameSite': 'None', 'secure': True, 'value': '3434eb6af78e421b8a32e6073184148f_1641403980978'}]
[]
13、選項卡管理
在訪問網頁的時候,會開啟一個個選項卡 Selenium 中,我們也可以對選項卡進行操作
import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.ui import WebDriverWait
driver = webdriver.Chrome()
driver.get("https://www.taobao.com/")
driver.execute_script('window.open()')
print(driver.window_handles)
driver.switch_to.window(driver.window_handles[1])
driver.get("https://www.baidu.com")
time.sleep(1)
driver.switch_to.window(driver.window_handles[0])
driver.get("https://www.python.org")
14、捕獲例外
在使用 Selenium 的程序中,難免會遇到一些例外,所以我們需要try except陳述句來捕獲各種例外
import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException,NoSuchElementException
driver = webdriver.Chrome()
try:
driver.get("https://www.baidu.com")
except TimeoutException:
print('Time Out')
try:
driver.find_element_by_id("word")
except NoSuchElementException:
print("No Element")
finally:
driver.close()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/404366.html
標籤:python
上一篇:自動化實戰之Cypress
