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)