1. 程式人生 > 實用技巧 >知名一線大咖帶你簡單學習Selenium的基本用法

知名一線大咖帶你簡單學習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)