Python+Selenium自動化總結

Python+Selenium自動化總結

一、環境搭建

1.一、安裝selenium模塊文件

pip install selenium

1.二、安裝ChromeDriver驅動

【1】下載安裝Chrome瀏覽器。css

【2】查看Chrome版本。html

  • 點擊Chrome菜單「幫助」→「關於Google Chrome」,查看Chrome的版本號。
    【3】下載對應ChromeDriver驅動。
  • 官方網站:https://sites.google.com/a/chromium.org/chromedriver
  • 下載地址:https://chromedriver.storage.googleapis.com/index.html

【4】環境變量配置。python

  • 在Windows下,下載完成後,將ChromeDriver的可執行文件chromedriver.exe文件拖到Python的Scripts目錄下。

1.三、安裝GeckoDriver驅動(Firefox瀏覽器)

【1】下載GeckoDriver驅動。ios

  • 在GitHub上找到GeckoDriver的發行版本,而後根據本身的系統和位數選擇對應的驅動下載。
  • GitHub:https://github.com/mozilla/geckodriver
  • 下載地址:https://github.com/mozilla/geckodriver/releases

【2】環境變量配置nginx

  • 在Windows下,直接將geckodriver.exe文件拖到Python的Scripts目錄下。

二、基本使用方法

2.一、初始化瀏覽器驅動

# 0、導入模塊文件
from selenium import webdriver

# 一、初始化瀏覽器爲chrome瀏覽器
browser = webdriver.Chrome()

# 二、初始化瀏覽器爲firefox瀏覽器
browser = webdriver.Firefox()

# 三、初始化瀏覽器爲無界面的chrome瀏覽器
option = webdriver.ChromeOptions()
option.add_argument("headless")
driver = webdriver.Chrome(chrome_options=option)

2.二、設置瀏覽器大小

  • maximize_window():設置瀏覽器大小爲全屏
  • set_window_size(500,500):設置瀏覽器分辨率爲:500×500
from selenium import webdriver
import time  

browser = webdriver.Chrome()
browser.maximize_window()   #設置瀏覽器大小:全屏
browser.get('https://www.baidu.com') 
time.sleep(2)

browser.set_window_size(500,500)  # 分辨率 1280*800  
time.sleep(2)

browser.set_window_size(1024,768)  # 分辨率 1024*768  
time.sleep(2)

2.三、刷新瀏覽器頁面

  • refresh()方法:刷新瀏覽器頁面
from selenium import webdriver
import time  

browser = webdriver.Chrome()
browser.maximize_window()   #設置瀏覽器大小:全屏
browser.get('https://www.baidu.com')  
time.sleep(1)

try:
    browser.refresh()  #刷新頁面
    print('刷新頁面')
except Exception as e:
    print('test fail')

#輸出內容:刷新頁面

2.四、瀏覽器後退和前進

  • back():後退
  • forward():前進
from selenium import webdriver
import time  

browser = webdriver.Chrome()
browser.maximize_window()   #設置瀏覽器大小:全屏
browser.get('https://www.baidu.com')  

#點擊打開百度新聞頁面
browser.find_element_by_link_text('新聞').click()
time.sleep(2)

browser.back()  #後退:回到百度首頁
time.sleep(2)

browser.forward()  #前進:前進到百度新聞頁面
time.sleep(2)

三、獲取頁面信息

3.一、頁面title

  • title:獲取當前頁面的標題顯示的字段
from selenium import webdriver
import time  

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')  

#打印網頁標題
print(browser.title)
#輸出內容:百度一下,你就知道

3.二、頁面URL

  • current_url:獲取當前頁面的URL
from selenium import webdriver
import time  

browser = webdriver.Chrome()
browser.get('https://www.baidu.com') 

#打印網頁標題
print(browser.current_url)
#輸出內容:https://www.baidu.com/

3.三、瀏覽器版本號

  • capabilities['version']):打印瀏覽器version的值
from selenium import webdriver
import time  

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')  

#打印網頁標題
print(browser.capabilities['version'])
#輸出內容:67.0.3396.87

3.四、元素尺寸

  • size:返回元素的尺寸
from selenium import webdriver
import time  

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')  

#定位輸入框
input_box = browser.find_element_by_id('kw')
#打印輸入框尺寸
print(input_box.size)
#輸出內容:{'height': 22, 'width': 500}

3.五、元素的文本

  • text:返回元素的文本信息
from selenium import webdriver
import time  

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')  

#定位備案元素
recordcode = browser.find_element_by_id('jgwab')
#打印備案元素信息
print(recordcode.text)
#輸出內容:京公網安備11000002000001號

3.六、元素屬性值

  • get_attribute('')方法
  • get_attribute('href'):獲取href屬性值
  • get_attribute('id'):獲取id屬性值
# coding=utf-8
import time
from selenium import webdriver


driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(6)
driver.get("https://www.baidu.com")
time.sleep(1)

for link in driver.find_elements_by_xpath("//*[@href]"):
    print (link.get_attribute('href'))
driver.quit()

四、定位頁面元素

4.一、ID定位元素

from selenium import webdriver
# 設置瀏覽器
browser = webdriver.Chrome()
#設置瀏覽器大小:全屏
browser.maximize_window()
#打開百度首頁
browser.get('https://www.baidu.com/')
#定位百度搜索輸入框以前,先分析下它的html結構
#<input type="text" class="s_ipt nobg_s_fm_hover" name="wd" id="kw" maxlength="100" autocomplete="off">
#發現它的 id="kw" ,接下來咱們就經過id進行定位
try:
    browser.find_element_by_id('kw').send_keys('哈哈')
    print('test post:id')
except Exception as e:
    print('test fail')
 #輸出內容:test post:id

4.二、name定位元素

from selenium import webdriver
browser = webdriver.Chrome()
browser.maximize_window()

#打開百度首頁
browser.get('https://www.baidu.com/')
#搜索框的html結構:<input type="text" class="s_ipt nobg_s_fm_hover" name="wd" id="kw" maxlength="100" autocomplete="off">
# 根據name屬性定位
try:
    browser.find_element_by_name('wd').send_keys('哈哈')
    print('test post:name')
except Exception as e:
    print('test fail')

#輸出內容:test post:name

4.三、class定位元素

from selenium import webdriver
browser = webdriver.Chrome()
browser.maximize_window()

#打開百度首頁
browser.get('https://www.baidu.com/')
#搜索框的html結構:<input type="text" class="s_ipt nobg_s_fm_hover" name="wd" id="kw" maxlength="100" autocomplete="off">
# 根據class_name屬性定位
try:
    browser.find_element_by_class_name('s_ipt').send_keys('哈哈')
    print('test post:class_name')
except Exception as e:
    print('test fail')

#輸出內容:test post:class_name

4.四、tag_name定位元素

from selenium import webdriver
browser = webdriver.Chrome()
browser.maximize_window()

#打開百度首頁
browser.get('https://www.baidu.com/')
#搜索框的html結構:<input type="text" class="s_ipt nobg_s_fm_hover" name="wd" id="kw" maxlength="100" autocomplete="off">
# 根據tag_name屬性定位
try:
    browser.find_element_by_tag_name('form')
    print('test post:tag_name')
except Exception as e:
    print('test fail')

#輸出內容:test post:tag_name

4.五、link_text定位元素

  • link_text:根據跳轉連接上面的文字來定位元素。
from selenium import webdriver
browser = webdriver.Chrome()
browser.maximize_window()

#打開百度首頁
browser.get('https://www.baidu.com/')
# 根據link_text屬性定位元素「新聞」,而後點擊按鈕
try:
    browser.find_element_by_link_text('新聞').click()
    print('test post:tag_name')
except Exception as e:
    print('test fail')

#輸出內容:test post:link_text

4.六、partial_link_text定位元素

  • 和link_text定位元素差很少,partial_link_text是經過文字信息中的部分字段來定位元素。
from selenium import webdriver
browser = webdriver.Chrome()
browser.maximize_window()

#打開百度首頁
browser.get('https://www.baidu.com/')
# 根據partial_link_text屬性定位元素「新聞」,而後點擊按鈕
try:
    browser.find_element_by_partial_link_text('聞').click()
    print('test post:tag_name')
except Exception as e:
    print('test fail')

#輸出內容:test post:partial_link_text

4.七、xpath定位元素

from selenium import webdriver
browser = webdriver.Chrome()
browser.maximize_window()

#打開百度首頁
browser.get('https://www.baidu.com/')
# 根據xpath定位元素
try:
    browser.find_element_by_xpath('//*[@id="kw"]').send_keys('哈哈')
    print('test post:xpath')
except Exception as e:
    print('test fail')

#輸出內容:test post:xpath

4.八、CSS定位頁面元素

from selenium import webdriver
browser = webdriver.Chrome()
browser.maximize_window()

#打開百度首頁
browser.get('https://www.baidu.com/')
# 根據css_selector定位元素
try:
    browser.find_element_by_css_selector('#kw').send_keys('哈哈')
    print('test post:xpath')
except Exception as e:
    print('test fail')

#輸出內容:test post:css_selector

4.九、By定位

  • 除了使用上面的方法外,還能夠利用find_element()方法,經過By來定位元素。
  • 使用以前須要導入By類:
#導入By類
from selenium.webdriver.common.by import By
  • 那麼上面的方法還能夠改寫爲:
browser.find_element(By.ID,'kw')
browser.find_element(By.NAME,'wd')
browser.find_element(By.CLASS_NAME,'s_ipt')
browser.find_element(By.TAG_NAME,'form')
browser.find_element(By.LINK_TEXT,'新聞')
browser.find_element(By.PARTIAL_LINK_TEXT,'聞')
browser.find_element(By.XPATH,'//*[@id="kw"]')
browser.find_element(By.CSS_SELECTOR,'#kw')

4.十、定位一組元素

  • 定位一組元素和定位某個元素差很少,惟一區別就是在單詞element後面增長了一個s表示複數:
find_elements_by_id('')
find_elements_by_id_by_class_name('')
find_elements_by_tag_name('')
find_elements_by_link_text('')
find_elements_by_partial_link_text('')
find_elements_by_xpath('')
find_elements_by_css_selector('')

五、頁面操做

5.一、輸入內容:send_keys()

#定位輸入框
input_box = browser.find_element_by_id('kw')
#輸入內容
input_box.send_keys('關鍵字')

5.二、點擊按鈕:click()

#定位搜索按鈕
button = browser.find_element_by_id('su')
button.click()

5.三、清空輸入框:clear()

#定位輸入框
input_box = browser.find_element_by_id('kw')
#清空輸入框
input_box.clear()

5.四、模擬'回車'操做:submit()

  • submit():一般應用於提交表單;例如:搜索框輸入內容後的回車操做。
from selenium import webdriver

browser = webdriver.Chrome()
browser.maximize_window()
browser.get('https://www.baidu.com')

# 定位輸入框
input_box = browser.find_element_by_id('kw')
# 輸入關鍵詞
input_box.send_keys('關鍵字')
# 模擬回車操做
input_box.submit()

5.五、單選框選中

from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('http://news.baidu.com/')
time.sleep(1)

try:
    #定位搜索框下面的新聞全文和新聞標題單選項
    radio_button = driver.find_elements_by_css_selector(".search-radios>input")
    # 定位的一組元素後,返回的是一個列表,這裏就循環選中對應的選項
    for i in radio_button:
        i.click()
    print ('選中單選框.')
except Exception as e:
    print ('fail',format(e))

5.五、複選框選中

from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://passport.baidu.com/v2/?reg&tt=1529850358050&overseas=undefined&gid=02B2650-6D11-430E-A19D-529F69B9F1CE&tpl=xw&u=http%3A%2F%2Fnews.baidu.com%2F')
time.sleep(1)

try:
    #定位 閱讀並接受《百度用戶協議》及《百度隱私權保護聲明》 的多選框
    checkbox = driver.find_elements_by_css_selector("#TANGRAM__PSP_3__isAgree")
    # 定位的一組元素後,返回的是一個列表,這裏就循環選中對應的選項
    for i in checkbox:
        i.click()
    print ('選中多選框')
except Exception as e:
    print ('fail',format(e))

5.六、操做下拉框:Select模塊(index)

  • selenium提供了Select模塊,能夠直接根據屬性或索引定位。

【1】導入select方法:git

from selenium.webdriver.support.select import Select

【2】Select模塊中的定位方法。github

'''一、三種選擇某一選項項的方法'''

select_by_index()           # 經過索引定位;注意:index索引是從「0」開始。
select_by_value()           # 經過value值定位,value標籤的屬性值。
select_by_visible_text()    # 經過文本值定位,即顯示在下拉框的值。

'''二、三種返回options信息的方法'''

options                     # 返回select元素全部的options
all_selected_options        # 返回select元素中全部已選中的選項
first_selected_options      # 返回select元素中選中的第一個選項 


'''三、四種取消選中項的方法'''

deselect_all                # 取消所有的已選擇項
deselect_by_index           # 取消已選中的索引項
deselect_by_value           # 取消已選中的value值
deselect_by_visible_text    # 取消已選中的文本值

【3】使用實例web

'''這個是我百度首頁搜索設置裏面的一個下拉框html代碼'''
html = ''' <select name="NR" id="nr"> <option value="10" selected="">每頁顯示10條</option> <option value="20">每頁顯示20條</option> <option value="50">每頁顯示50條</option> </select> '''

# coding=utf-8
from selenium import webdriver
from selenium.webdriver.support.select import Select

# 初始化
driver = webdriver.Chrome()
......

'''若是咱們須要選擇:50條,那麼能夠用下面的三種方法 先選中輸入框元素,而後在選擇對應選項'''
# 根據索引選擇
Select(driver.find_element_by_name("NR")).select_by_index("2")
# 根據value值選擇
Select(driver.find_element_by_name("NR")).select_by_value("50")
# 根據文本值選擇
Select(driver.find_element_by_name("NR")).select_by_visible_text("每頁顯示50條")

driver.quit()

5.七、多個瀏覽器窗口切換

切換瀏覽器窗口的時候將會用到的三個方法:ajax

  • current_window_handle:獲取當前窗口的句柄。
  • window_handles:返回當前瀏覽器的全部窗口的句柄。
  • switch_to_window():用於切換到對應的窗口。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com/")

# 獲取當前窗口句柄
seacher_windows = driver.current_window_handle

# 跳轉新頁面
driver.find_element_by_xpath('//*[@id="block1_server"]/div[2]/ul/li[1]/div/div[1]/a[3]').click()

all_handles = driver.window_handles
#回到首頁
for handle in all_handles:
    if handle != seacher_windows:
        driver.switch_to.window(seacher_windows)

六、模擬鼠標操做:ActionChains類

【1】使用以前須要引入 ActionChains 類。chrome

from selenium.webdriver.common.action_chains import ActionChains

【2】ActionChains類提供的鼠標經常使用方法:

  • perform():執行全部 ActionChains 中存儲的行爲。
  • context_click():右擊
  • double_click():雙擊
  • drag_and_drop():拖到
  • move_to_element():鼠標懸停

6.一、鼠標右擊實例

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains  # 引入 ActionChains 類

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')  


# 定位到要右擊的元素
right_click = browser.find_element_by_link_text('新聞')

# 對定位到的元素執行鼠標右鍵操做
#ActionChains(driver):調用ActionChains()類,並將瀏覽器驅動browser做爲參數傳入
#context_click(right_click):模擬鼠標雙擊,須要傳入指定元素定位做爲參數
#perform():執行ActionChains()中儲存的全部操做,能夠看作是執行以前一系列的操做
try:
    ActionChains(browser).context_click(right_click).perform()
    print('成功右擊')
except Exception as e:
    print('fail')
#輸出內容:成功雙擊

注意:

  • ActionChains(driver):調用ActionChains()類,並將瀏覽器驅動browser做爲參數傳入
  • context_click(right_click):模擬鼠標雙擊,須要傳入指定元素定位做爲參數
  • perform():執行ActionChains()中儲存的全部操做,能夠看作是執行以前一系列的操做

6.二、鼠標右擊:context_click()

# 鼠標右擊
# 定位到要右擊的元素
right_click  = browser.find_element_by_id("xx")
 # 對定位到的元素執行右擊操做
ActionChains(browser).move_to_element(right_click ).perform()

6.三、鼠標雙擊:double_click()

# 定位到要右擊的元素
double_click = browser.find_element_by_id('xx')

# 對定位到的元素執行鼠標右鍵操做
ActionChains(browser).context_click(double_click).perform()

6.四、鼠標拖動:drag_and_drop(source,target)

  • source:開始位置;須要拖動的元素
  • target:結束位置;拖到後須要放置的目的地元素
# 開始位置:定位到元素的原位置
source = driver.find_element_by_id("xx")

# 結束位置:定位到元素要移動到的目標位置
target = driver.find_element_by_id("xx")

# 執行元素的拖放操做
ActionChains(driver).drag_and_drop(source,target).perform()

6.五、鼠標懸停:move_to_element()

# 定位到要懸停的元素
move = driver.find_element_by_id("xx")

# 對定位到的元素執行懸停操做
ActionChains(driver).move_to_element(move).perform()

七、模擬鍵盤操做

  • selenium中的Keys()類提供了大部分的鍵盤操做方法;經過send_keys()方法來模擬鍵盤上的按鍵。

【1】導入鍵盤類 Keys()

from selenium.webdriver.common.keys import Keys

7.一、經常使用的鍵盤操做:

  • send_keys(Keys.BACK_SPACE):刪除鍵(BackSpace)
  • send_keys(Keys.SPACE):空格鍵(Space)
  • send_keys(Keys.TAB):製表鍵(TAB)
  • send_keys(Keys.ESCAPE):回退鍵(ESCAPE)
  • send_keys(Keys.ENTER):回車鍵(ENTER)
  • send_keys(Keys.CONTRL,'a'):全選(Ctrl+A)
  • send_keys(Keys.CONTRL,'c'):複製(Ctrl+C)
  • send_keys(Keys.CONTRL,'x'):剪切(Ctrl+X)
  • send_keys(Keys.CONTRL,'v'):粘貼(Ctrl+V)
  • send_keys(Keys.F1):鍵盤F1
  • .....
  • send_keys(Keys.F12):鍵盤F12

7.二、鍵盤操做實例

from selenium import webdriver  
from selenium.webdriver.common.keys import Keys  

driver=webdriver.Chrome()  
driver.get("http://www.baidu.com")  
#輸入關鍵詞內容
driver.find_element_by_id("kw").send_keys("selenium")  
#刪除鍵
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)  
#空格鍵 
driver.find_element_by_id("kw").send_keys(Keys.SPACE)  
#輸入內容
driver.find_element_by_id("kw").send_keys("教程")  
#全選(Ctrl+A) 
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a') 
#剪切(Ctrl+X) 
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x') 
#粘貼(Ctrl+V) 
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'v')  
#回車鍵 
driver.find_element_by_id("kw").send_keys(Keys.ENTER)

八、設置頁面等待加載條件

[toc]

若是遇到使用ajax加載的網頁,頁面元素可能不是同時加載出來的,這個時候,就須要咱們經過設置一個等待條件,等待頁面元素加載完成,避免出現由於元素未加載致使的錯誤的出現。

WebDriver提供了兩種等待類型:顯示等待、隱式等待。

8.一、顯示等待:WebDriverWait()類+ExpectedCondition類

  • 顯示等待:設置一個等待時間和一個條件,在規定時間內,每隔一段時間查看下條件是否成立,若是成立那麼程序就繼續執行,不然就提示一個超時異常(TimeoutException)。
  • 一般狀況下WebDriverWait類會結合ExpectedCondition類一塊兒使用。

【實例】

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 設置瀏覽器:driver 等待時間:20s
wait = WebDriverWait(driver, 20)
# 設置判斷條件:等待id='kw'的元素加載完成
input_box = wait.until(EC.presence_of_element_located((By.ID, 'kw')))
# 在關鍵詞輸入:關鍵詞
input_box.send_keys('關鍵詞')

8.1.一、WebDriverWait的具體參數和方法:

WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
    driver: 瀏覽器驅動
    timeout: 超時時間,等待的最長時間(同時要考慮隱性等待時間)
    poll_frequency: 每次檢測的間隔時間,默認是0.5秒
    ignored_exceptions:超時後的異常信息,默認狀況下拋出NoSuchElementException異常


until(method,message='')
    method: 在等待期間,每隔一段時間調用這個傳入的方法,直到返回值不是False
    message: 若是超時,拋出TimeoutException,將message傳入異常


until_not(method,message='')
    until_not 與until相反,until是當某元素出現或什麼條件成立則繼續執行,
    until_not是當某元素消失或什麼條件不成立則繼續執行,參數也相同。
    method
    message

8.1.二、設置頁面加載判斷條件:ExpectedCondition

  • ExpectedCondition中可以使用的判斷條件:
from selenium.webdriver.support import expected_conditions as EC
 # 判斷標題是否和預期的一致
title_is
# 判斷標題中是否包含預期的字符串
title_contains
 # 判斷指定元素是否加載出來
presence_of_element_located
# 判斷全部元素是否加載完成
presence_of_all_elements_located
 # 判斷某個元素是否可見. 可見表明元素非隱藏,而且元素的寬和高都不等於0,傳入參數是元組類型的locator
visibility_of_element_located
# 判斷元素是否可見,傳入參數是定位後的元素WebElement
visibility_of
# 判斷某個元素是否不可見,或是否不存在於DOM樹
invisibility_of_element_located
 # 判斷元素的 text 是否包含預期字符串
text_to_be_present_in_element
# 判斷元素的 value 是否包含預期字符串
text_to_be_present_in_element_value
 #判斷frame是否可切入,可傳入locator元組或者直接傳入定位方式:id、name、index或WebElement
frame_to_be_available_and_switch_to_it
 #判斷是否有alert出現
alert_is_present
 #判斷元素是否可點擊
element_to_be_clickable
 # 判斷元素是否被選中,通常用在下拉列表,傳入WebElement對象
element_to_be_selected
# 判斷元素是否被選中
element_located_to_be_selected
# 判斷元素的選中狀態是否和預期一致,傳入參數:定位後的元素,相等返回True,不然返回False
element_selection_state_to_be
# 判斷元素的選中狀態是否和預期一致,傳入參數:元素的定位,相等返回True,不然返回False
element_located_selection_state_to_be
 #判斷一個元素是否仍在DOM中,傳入WebElement對象,能夠判斷頁面是否刷新了
staleness_of

【調用方法以下】

WebDriverWait(driver, 超時時長, 調用頻率, 忽略異常).until(可執行方法, 超時時返回的信息)

8.二、隱式等待:implicitly_wait()

  • implicitly_wait(xx):設置等待時間爲xx秒,等待元素加載完成,若是到了時間元素沒有加載出,就拋出一個NoSuchElementException的錯誤。
  • 注意:隱性等待對整個driver的週期都起做用,因此只要設置一次便可。
from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(30)  # 隱性等待,最長等30秒

driver.get('https://www.baidu.com')

print(driver.current_url)
print(driver.title)

8.三、強制等待:sleep()

  • 強制等待:無論瀏覽器元素是否加載完成,程序都得等待3秒,3秒一到,繼續執行下面的代碼。
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

sleep(3)  # 強制等待3秒再執行下一步

print(driver.title)
相關文章
相關標籤/搜索