知名一線大咖帶你簡單學習Selenium的基本用法
閒言
requests模組是一個不完全模擬瀏覽器行為的模組,只能爬取到網頁的HTML文件資訊,無法解析和執行CSS、JavaScript程式碼,因此要我們做人為判斷。
selenium模組本質是通過驅動瀏覽器完全模擬瀏覽器的操作,比如跳轉、輸入、點選、下拉等,來拿到網頁渲染之後的結果,可支援多種瀏覽器。由於selenium解析執行了CSS、JavaScript所以相對requests它的效能是低下的。
selenium基本使用
import time
from selenium import webdriver#驅動瀏覽器
from selenium.webdriver import ActionChains #滑動
from selenium.webdriver.common.by import By #選擇器
from selenium.webdriver.common.by import By #按什麼方式查詢,By.ID,By.CSS_SELECTOR
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() #呼叫Chrome 驅動,生成瀏覽器物件
wait=WebDriverWait(browser,10) #設定selenium等待瀏覽器載入完畢的最大等待時間
try:
browser.get('https://www.baidu.com/')
baidu_input_tag=browser.find_element_by_id("kw") #尋找到百度頁面的id='kw'的標籤
key=baidu_input_tag.send_keys('張根') #在標籤中輸入'張根'
baidu_button_tag=browser.find_element_by_id('su') #尋找到百度頁面id='su'的標籤
baidu_button_tag.click() #點選
wait.until(EC.presence_of_element_located((By.ID,'4'))) #等待百度頁面 ID='4'的標籤完畢,最大等待10秒
'''
請求相關:
browser.get('url')
響應相關:
print(browser.page_source) #顯示網頁原始碼
print(browser.current_url) #獲取當前url
print(browser.get_cookies()) #獲取當前網頁cokies
'''
finally:
time.sleep(5)
browser.close() #關閉瀏覽器
selenium選擇器
模擬瀏覽器無非請求 ----> 顯示頁面 -----> 尋找標籤 ------> 點選標籤的事件,所以selenium的關鍵是怎麼找到頁面中的標籤,進而觸發標籤事件。
1、通過標籤id屬性進行定位
browser.find_element(By.ID,'kw').send_keys("美女")
browser.find_element_by_id('kw').send_keys('性感')
2、通過標籤name屬性進行定位
browser.find_element_by_name("wd").send_keys("Linux")
browser.find_element(By.NAME,'wd').send_keys("美女")
3、通過標籤名進行定位
browser.find_element_by_tag_name("input").send_keys("selenium")
browser.find_element(By.TAG_NAME, 'input').send_keys('aaa')
4、通過CSS查詢方式進行定位
browser.find_element(By.CSS_SELECTOR, '#kw').send_keys('python django')
browser.find_element(By.CSS_SELECTOR, '#kw').send_keys('python 之美')
5、通過xphan方式定位
browser.find_element_by_xpath('//*[@id="kw"]').send_keys("python Tornado")
browser.find_element(By.XPATH, '//*[@id="kw"]').send_keys('吐槽大會')
6、通過搜尋 頁面中 連結進行定位
有時候不是一個輸入框也不是一個按鈕,而是一個文字連結,我們可以通過link
browser.find_element_by_link_text("新聞").click()
7、通過搜尋 頁面中 連結進行定位 ,可以支援模糊匹配
browser.find_element_by_partial_link_text("新").click()
browser.find_element_by_partial_link_text("聞").click()
8、小結
上述均可以改寫成find_element(By.ID,'kw')的形式
find_elements_by_xxx的形式是查詢到多個元素,結果為列表
import time
from selenium import webdriver#驅動瀏覽器
from selenium.webdriver import ActionChains #滑動
from selenium.webdriver.common.by import By #選擇器
from selenium.webdriver.common.by import By #按照什麼方式查詢,By.ID,By.CSS_SELECTOR
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() #呼叫Chrome 驅動,生成瀏覽器物件
wait=WebDriverWait(browser,10) #設定selenium等待瀏覽器載入完畢的最大等待時間
try:
browser.get('https://www.baidu.com/')
#通過標籤id屬性進行定位
# browser.find_element(By.ID,'kw').send_keys("美女")
# browser.find_element_by_id('kw').send_keys('性感')
#通過標籤name屬性進行定位
# browser.find_element_by_name("wd").send_keys("Linux")
# browser.find_element(By.NAME,'wd').send_keys("美女")
#通過標籤名稱進行定位
# browser.find_element_by_tag_name("input").send_keys("selenium")
# browser.find_element(By.TAG_NAME, 'input').send_keys('aaa')
# 通過CSS查詢方式進行定位
# browser.find_element(By.CSS_SELECTOR, '#kw').send_keys('python django')
# browser.find_element(By.CSS_SELECTOR, '#kw').send_keys('泰山')
# 通過xphan方式定位
# browser.find_element_by_xpath('//*[@id="kw"]').send_keys("python Tornado")
# browser.find_element(By.XPATH, '//*[@id="kw"]').send_keys('吐槽大會')
# 通過搜尋 頁面中 連結進行定位
# browser.find_element_by_link_text("新聞").click()
#通過搜尋 頁面中 連結進行定位 ,可以支援模糊匹配
# browser.find_element_by_partial_link_text("新").click()
# browser.find_element_by_partial_link_text("聞").click()
finally:
browser.find_element_by_id("su").click()
time.time(3)
browser.close() # 關閉瀏覽器browser.quit()
等待元素被載入
1、selenium只是模擬瀏覽器的行為,而瀏覽器解析頁面是需要時間的(執行css,js),一些元素可能需要過一段時間才能加載出來,為了保證能查詢到元素,必須等待
對面試經驗、軟體、介面、自動化測試感興趣可以175317069,群內會有不定期的免費資料連結發放,這些資料都是從各個技術網站蒐集、整理出來的。如果你有好的學習資料可以私聊發我,我會註明出處之後分享給大家。
2、等待的方式分兩種
wait=WebDriverWait(browser,10) #顯式等待
wait1=browser.implicitly_wait(10) #隱式等待
wait.until(EC.presence_of_element_located((By.CLASS_NAME,'tH0')))
test = wait.until(lambda x: x.find_element_by_xpath('xpath'))
'''
顯式等待:指定等待某個標籤載入完畢
隱式等待:等待所有標籤載入完畢
'''
元素互動操作
ActionChains
用selenium做自動化,有時候會遇到需要模擬滑鼠操作才能進行的情況(如:iframe標籤),比如單擊、雙擊、點選滑鼠右鍵、拖拽(滑動驗證)等。而selenium給我們提供了一個類來處理這類事件——ActionChains
frame標籤切換
如果網頁頁面巢狀frame標籤,子頁面訪問不到父頁面的內容,父頁面也訪問不到子頁面的內容所以需要切換;
from selenium import webdriver
from selenium.webdriver import ActionChains #滑鼠鍵盤動作鏈
from selenium.webdriver.common.by import By # 按照什麼方式查詢,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys # 鍵盤按鍵操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait # 等待頁面載入某些元素
import time
browser=webdriver.Chrome()
wait1=WebDriverWait(browser,10)
browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
browser.switch_to.frame('iframeResult')#切換到id='iframewrapper'的iframe子標籤
action_chains=ActionChains(browser) #例項化1個動作鏈佇列
source=browser.find_element_by_id('draggable') #找到拖拽的源標籤
target=browser.find_element_by_id('droppable')#找到拖拽的目標標籤
action_chains.drag_and_drop(source,target).perform()#把動作放到動作鏈中,perform()準備序列執行;
'''
click(on_element=None) ——單擊滑鼠左鍵
click_and_hold(on_element=None) ——點選滑鼠左鍵,不鬆開
context_click(on_element=None) ——點選滑鼠右鍵
double_click(on_element=None) ——雙擊滑鼠左鍵
drag_and_drop(source, target) ——拖拽到某個元素然後鬆開
drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某個座標然後鬆開
key_down(value, element=None) ——按下某個鍵盤上的鍵
key_up(value, element=None) ——鬆開某個鍵
move_by_offset(xoffset, yoffset) ——滑鼠從當前位置移動到某個座標
move_to_element(to_element) ——滑鼠移動到某個元素
move_to_element_with_offset(to_element, xoffset, yoffset) ——移動到距某個元素(左上角座標)多少距離的位置
perform() ——執行鏈中的所有動作
release(on_element=None) ——在某個元素位置鬆開滑鼠左鍵
send_keys(*keys_to_send) ——傳送某個鍵到當前焦點的元素
send_keys_to_element(element, *keys_to_send) ——傳送某個鍵到指定元素
'''
time.sleep(5)
browser.quit()
關於ActionChains參看:http://blog.csdn.net/huilan_same/article/details/52305176
1.點選,清空
import time
from selenium import webdriver#驅動瀏覽器
from selenium.webdriver import ActionChains #滑動
from selenium.webdriver.common.by import By #選擇器
from selenium.webdriver.common.by import By #按照什麼方式查詢,By.ID,By.CSS_SELECTOR
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() #呼叫Chrome 驅動,生成瀏覽器物件
wait=WebDriverWait(browser,10) #設定selenium等待瀏覽器載入完畢的最大等待時間
browser.get('https://www.baidu.com/')
browser.find_element(By.ID,'kw').send_keys("美女")
browser.find_element_by_id("su").click()#點選按鈕
time.sleep(4)
browser.find_element(By.ID,'kw').clear()#清空input標籤中的內容,讓重新輸入
browser.find_element_by_id('kw').send_keys('性感')
browser.find_element_by_id("su").click() #點選按鈕
2.前進和後退
import time
from selenium import webdriver#驅動瀏覽器
from selenium.webdriver import ActionChains #滑動
from selenium.webdriver.common.by import By #選擇器
from selenium.webdriver.common.by import By #按照什麼方式查詢,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #鍵盤按鍵操作
from selenium.webdriver.support import expected_conditions as EC #等待所有標籤載入完畢
from selenium.webdriver.support.wait import WebDriverWait #等待頁面載入完畢 尋找某些元素
import time
from selenium import webdriver
browser=webdriver.Chrome()
browser.get('http://www.cnblogs.com/sss4/')
browser.find_element_by_partial_link_text( 'PythonWEB框架之Flask').click()
time.sleep(3)
browser.back() #後退
time.sleep(3)
browser.forward() #前進
time.sleep(5)
browser.close()
3.cokies相關
import time
from selenium import webdriver#驅動瀏覽器
from selenium.webdriver import ActionChains #滑動
from selenium.webdriver.common.by import By #選擇器
from selenium.webdriver.common.by import By #按照什麼方式查詢,By.ID,By.CSS_SELECTOR
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 import webdriver
browser=webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies()) #獲取cokies資訊
browser.add_cookie({'k1':'xxx','k2':'yyy'}) #新增cokies資訊
print(browser.get_cookies())
browser.delete_all_cookies() #刪除cokies資訊,慎用
4.選項卡管理
from selenium import webdriver
browser=webdriver.Chrome()
browser.execute_script('window.open()') #開啟選項卡
browser.execute_script('window.open()')
print(browser.window_handles) #獲取所有的選項卡
browser.switch_to_window(browser.window_handles[0]) #切換至選項卡0
browser.get('https://www.taobao.com')
browser.switch_to_window(browser.window_handles[1]) #切換至選項卡1
browser.get('https://www.baidu.com')
browser.switch_to_window(browser.window_handles[2]) #切換至選項卡2
browser.get('https://v.qq.com/')
5.selenium異常處理
from selenium import webdriver
from selenium.common.exceptions import TimeoutException,NoSuchElementException,NoSuchFrameException
try:
browser=webdriver.Chrome()
browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
browser.switch_to.frame('iframssseResult')
except TimeoutException as e:
print(e)
except NoSuchFrameException as e:
print(e)
finally:
browser.close()
6.獲取元素屬性
//獲取a連線的href屬性值
browser.find_element_by_xpath('//a')).get_attribute('href')
7.切換視窗
定位iframe
1.有id,並且唯一,直接寫id
driver.switch_to_frame("x-URS-iframe")
driver.switch_to.frame("x-URS-iframe")
2.有name,並且唯一,直接寫name
driver.switch_to_frame("xxxx")
driver.switch_to.frame("xxxx")
3.無id,無name,先定位iframe元素
iframe = driver.find_elements_by_tag_name("iframe")[0]
driver.switch_to_frame(iframe)
driver.switch_to.frame(iframe)
4.從frame中切回主文件(switch_to.default_content())
切到frame中之後,我們便不能繼續操作主文件的元素,這時如果想操作主文件內容,則需切回主文件。
driver.switch_to.default_content()
8.獲取cookie
獲取cookie
cookie = browser.get_cookies()
#獲取到的是一個坑爹的list,沒錯,是個list,所用下面的程式碼可以轉成request使用的cookiejar
cookie_jar = requests.cookies.RequestsCookieJar()
for item in cookie:
cookie_jar.set(item["name"], item["value"], path='/', domain=item["domain"])
print("cookie處理後---->", cookie_jar)