python自動化測試之Selenium詳解
1.安裝
完成自動化測試,需要配置三個東西。
selenium
:pip就可以了
chrome
:瀏覽器下載一個谷歌瀏覽器就行
chrome-driver
:下載地址http://chromedriver.storage.googleapis.com/index.html
這里需要對應(yīng)到自己的瀏覽器版本下載。可以參考這篇
http://www.dbjr.com.cn/article/240643.htm
從瀏覽器上下載到本地后,本機(jī)mac上自動保存至Download/目錄下
但我們要把它轉(zhuǎn)移到該去的地方
具體終端命令如下:
#目錄到下載位置 cd Downloads/ #解壓zip文件 unzip chromedriver_mac64.zip #拿到解壓后文件Unix Executable類型文件后,移動它該去的位置 mv chromedriver /usr/local/bin/
2.基礎(chǔ)操作
下面就來了解一下 Selenium 的一些基礎(chǔ)操作把。先寫一點(diǎn)簡單的小功能演示一下:
from selenium import webdriver from selenium.webdriver.common.keys import Keys browser = webdriver.Chrome() browser.get('https://www.baidu.com') input = browser.find_element_by_id('kw') input.send_keys('楊冪') input.send_keys(Keys.ENTER) print(browser.current_url) print(browser.get_cookies()) print(browser.page_source)
運(yùn)行以上代碼,可以看到自動彈出來一個 Chrome 瀏覽器,并且上面標(biāo)示了: Chrome 正受到自動軟件的控制 。然后打開了百度,在輸入框中輸入了 “楊冪” 進(jìn)行搜索
2.1 聲明瀏覽器對象
Selenium 支持非常多的瀏覽器,如:
from selenium import webdriver # 聲明瀏覽器對象,需對應(yīng)的驅(qū)動程序方可使用 browser = webdriver.android() browser = webdriver.blackberry() browser = webdriver.chrome() browser = webdriver.edge() browser = webdriver.firefox() browser = webdriver.ie() browser = webdriver.opera() browser = webdriver.phantomjs() browser = webdriver.safari()
可以看到有我熟悉的 IE 瀏覽器、 Edge 瀏覽器、 FireFox 瀏覽器、 Opera 瀏覽器等等。
2.2 訪問網(wǎng)頁
訪問網(wǎng)頁可以使用 get() 方法,參數(shù)傳入我們想要訪問的網(wǎng)站即可:
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.jd.com/') print(browser.page_source)
通過上面兩行代碼,我們可以看到自動打開了瀏覽器并訪問的京東,在控制臺打印了京東的源代碼。
當(dāng)然,如果想要程序自動關(guān)閉瀏覽器的話可以使用:
browser.close()
2.3 查找單個節(jié)點(diǎn)
我們獲取到網(wǎng)頁后,第一步肯定是要先查找到 DOM 節(jié)點(diǎn)啊,然后可以直接從 DOM 節(jié)點(diǎn)中獲取數(shù)據(jù)。
不過有了 Selenium 以后,我們不僅可以查找到節(jié)點(diǎn)獲取數(shù)據(jù),還可以模擬用戶操作,比如在搜索框輸入某些內(nèi)容,點(diǎn)擊按鈕等等操作,不過還是先看看怎么查找節(jié)點(diǎn):
從上面這張圖可以看到,我們想要獲取輸入框,可以通過 id 進(jìn)行獲取,那么我們接下來的代碼要這么寫:
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.jd.com/') input_key = browser.find_element_by_id('key') print(input_key)
結(jié)果如下:
<selenium.webdriver.remote.webelement.WebElement (session="86d1ae1419bee22099a168dfbf921a27", element="53047804-ad39-4dfd-b3fb-a149fb1c8ac8")>
可以看到,我們獲得的元素類型是 WebElement 。
這里順手列出所有的獲得單個節(jié)點(diǎn)的方法:
find_element_by_id find_element_by_name find_element_by_xpath find_element_by_link_text find_element_by_partial_link_text find_element_by_tag_name find_element_by_class_name find_element_by_css_selector
此外, selenium 還未我們提供了一個通用方法 find_element() ,它需要傳入兩個參數(shù):查找方式 By 和值。實(shí)際上上面示例中的查找方式還可以這么寫(效果完全一樣哦~~~)
from selenium import webdriver from selenium.webdriver.common.by import By browser = webdriver.Chrome() browser.get('https://www.jd.com/') input_key1 = browser.find_element(By.ID, 'key') print(input_key1)
2.4 查找多個節(jié)點(diǎn)
比如我們要查找左邊的這種導(dǎo)航條的所有條目:
可以這么寫
lis = browser.find_elements_by_css_selector('.cate_menu li') print(lis)
結(jié)果如下:
[<selenium.webdriver.remote.webelement.WebElement (session="6341ab4f39733b5f6b6bd51508b62f1d", element="8e0d1a8c-d5dc-4b1f-8250-7f0eca864ea7")>, <selenium.webdriver.remote.webelement.WebElement (session="6341ab4f39733b5f6b6bd51508b62f1d", element="15cd4dc9-42f4-4ed7-9258-9aa29073243c")>,
......]
下面列出來所有的多節(jié)點(diǎn)選擇的方法:
find_elements_by_name find_elements_by_xpath find_elements_by_link_text find_elements_by_partial_link_text find_elements_by_tag_name find_elements_by_class_name find_elements_by_css_selector
同樣,多節(jié)點(diǎn)選擇也有一個 find_elements() 的方法,
3.等待
如今,大多數(shù) Web 應(yīng)用程序都在使用 AJAX 技術(shù)。當(dāng)瀏覽器加載頁面時(shí),該頁面中的元素可能會以不同的時(shí)間間隔加載。這使定位元素變得困難:如果 DOM 中尚不存在元素,則定位函數(shù)將引發(fā) ElementNotVisibleException 異常。使用等待,我們可以解決此問題。等待在執(zhí)行的動作之間提供了一定的松弛時(shí)間-主要是定位元素或?qū)υ撛剡M(jìn)行的任何其他操作。
Selenium Webdriver 提供兩種類型的等待-隱式和顯式。顯式等待使 WebDriver 等待特定條件發(fā)生,然后再繼續(xù)執(zhí)行。隱式等待使 WebDriver 在嘗試查找元素時(shí)輪詢DOM一定時(shí)間。
3.1 顯式等待
我們可以使用 time.sleep() 來設(shè)定等待時(shí)間,完全沒有問題,但是它需要將條件設(shè)置為要等待的確切時(shí)間段。如果我們不知道準(zhǔn)確的渲染時(shí)間,我們就無法設(shè)定一個比較合適的值。
Selenium 為我們提供了 WebDriverWait 與 ExpectedCondition 來完成這件事情,看代碼:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("https://www.jd.com/") try: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "key")) ) finally: driver.quit()
結(jié)果如下:
<selenium.webdriver.remote.webelement.WebElement (session="b1baacca997d18d7d54447127c844d15", element="a472369e-3196-4456-b43e-4e1b280bf5b9")>
上面我們使用了 WebDriverWait 來設(shè)置最長等待時(shí)間,這里我們選擇獲取 JD 首頁的輸入框,我們限定的等待時(shí)間為 10s ,如果它在 10s 內(nèi)都無法返回結(jié)果,將會拋出 TimeoutException 。默認(rèn)情況下, WebDriverWait 每 500 毫秒調(diào)用 ExpectedCondition ,直到成功返回。
3.2 隱式等待
隱式等待告訴 WebDriver 在嘗試查找不立即可用的一個或多個元素時(shí)在一定時(shí)間內(nèi)輪詢 DOM 。默認(rèn)設(shè)置為 0 。設(shè)置后,將在 WebDriver 對象的生存期內(nèi)設(shè)置隱式等待。
from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(10) # seconds driver.get("https://www.jd.com/") key = driver.find_element_by_id("key") print(key)
節(jié)點(diǎn)交互
Selenium 為我們提供了一些節(jié)點(diǎn)的交互動作,如輸入文字時(shí)可以用 send_keys() 方法,清空文字時(shí)可以用 clear() 方法,點(diǎn)擊按鈕時(shí)可以用 click() 方法。
from selenium import webdriver import time driver = webdriver.Chrome() driver.implicitly_wait(10) driver.get('https://www.taobao.com/') input = driver.find_element_by_id('q') input.send_keys('IPad') time.sleep(1) input.clear() input.send_keys('Surface Pro') button = driver.find_element_by_class_name('btn-search') button.click()
在上面這個示例中,我們先打開淘寶網(wǎng),并且開啟了隱式等待,先在搜索框中輸入了 IPad ,在等待 1s 后刪除,再輸入了 Surface Pro ,然后點(diǎn)擊了搜索按鈕,先在淘寶搜索需要用戶登錄才能搜索,所以我們直接跳轉(zhuǎn)到了登錄頁。
執(zhí)行 JavaScript
對于某些 Selenium API 沒有提供的操作,我們可以通過模擬運(yùn)行 JavaScript 的方式來完成,用到的方法是 execute_script() ,比如我們在淘寶首頁將滾動條滑到底部:
from selenium import webdriver driver = webdriver.Chrome() driver.get('https://www.taobao.com/') driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
獲取信息
前面我們介紹了如何拿到 DOM 節(jié)點(diǎn),那么最重要的是我們要從 DOM 節(jié)點(diǎn)上來獲取我們需要的信息。
因?yàn)槲覀儷@取的是 WebElement 類型,而 WebElement 也提供了相關(guān)的方法來提取節(jié)點(diǎn)信息。
from selenium import webdriver from selenium.webdriver.chrome.options import Options # 實(shí)例化一個啟動參數(shù)對象 chrome_options = Options() # 設(shè)置瀏覽器窗口大小 chrome_options.add_argument('--window-size=1366, 768') # 啟動瀏覽器 driver = webdriver.Chrome(chrome_options=chrome_options) url = 'https://www.geekdigging.com/' driver.get(url) title = driver.find_element_by_xpath('//*[@id="text-4"]/div/div/div[1]/div[2]/a') print(title) # 獲取屬性信息 print(title.get_attribute('href')) # 獲取文本信息 print(title.text) # 獲取位置 print(title.location) # 獲取大小 print(title.size)
上面因?yàn)?Chrome 默認(rèn)打開大小有點(diǎn)小,打開小編博客的時(shí)候小編選擇的這個 DOM 節(jié)點(diǎn)正好看到,所以小編設(shè)置了一下 Chrome 瀏覽器打開時(shí)的大小。
具體信息的供大家參考:
- parent:查找到此元素的WebDriver實(shí)例的內(nèi)部引用。
- rect:具有元素大小和位置的字典。
- screenshot_as_base64:以 base64 編碼字符串的形式獲取當(dāng)前元素的屏幕快照。
- screenshot_as_png:以二進(jìn)制數(shù)據(jù)獲取當(dāng)前元素的屏幕截圖。最后這兩個獲取元素屏幕快照,在獲取驗(yàn)證碼的時(shí)候?qū)Ⅱ?yàn)證碼截取出來會很好用的。
前進(jìn)和后退
我們使用瀏覽器最上面的地方有一個前進(jìn)和后退按鈕,Selenium 完成這兩個動作使用了 back() 和 forward() 這兩個方法。
import time from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.jd.com/') browser.get('https://www.taobao.com/') browser.get('https://www.geekdigging.com/') browser.back() time.sleep(1) browser.forward()
Cookies
又到了一個重點(diǎn)內(nèi)容, Cookies ,它是和服務(wù)端保持會話的一個重要元素。 Selenium 為我們提供了一些方法,讓我們可以方便的對 Cookies 進(jìn)行增刪改查等操作。示例如下:
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.geekdigging.com/') # 獲取 cookies print(browser.get_cookies()) # 添加一個 cookie browser.add_cookie({'name': 'name', 'domain': 'www.geekdigging.com', 'value': 'geekdigging'}) print(browser.get_cookies()) # 刪除所有 cookie browser.delete_all_cookies() print(browser.get_cookies())
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Python實(shí)現(xiàn)字符串與數(shù)組相互轉(zhuǎn)換功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)字符串與數(shù)組相互轉(zhuǎn)換功能,結(jié)合具體實(shí)例形式分析了Python字符串與數(shù)組相關(guān)轉(zhuǎn)換功能的相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2017-09-09python中使用Celery容聯(lián)云異步發(fā)送驗(yàn)證碼功能
Celery 是一個 基于python開發(fā)的分布式異步消息任務(wù)隊(duì)列,通過它可以輕松的實(shí)現(xiàn)任務(wù)的異步處理,本文重點(diǎn)給大家介紹使用Celery容聯(lián)云異步發(fā)送驗(yàn)證碼功能,感興趣的朋友一起看看吧2021-09-09python基于雙向鏈表實(shí)現(xiàn)LFU算法
這篇文章主要為大家詳細(xì)介紹了python基于雙向鏈表實(shí)現(xiàn)LFU算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05Python multiprocessing模塊中的Pipe管道使用實(shí)例
這篇文章主要介紹了Python multiprocessing模塊中的Pipe管道使用實(shí)例,本文直接給出使用實(shí)例,需要的朋友可以參考下2015-04-04Python實(shí)現(xiàn)數(shù)據(jù)庫編程方法詳解
這篇文章主要介紹了Python實(shí)現(xiàn)數(shù)據(jù)庫編程方法,較為詳細(xì)的總結(jié)了Python數(shù)據(jù)庫編程涉及的各種常用技巧與相關(guān)組件,需要的朋友可以參考下2015-06-06Anaconda+Pycharm環(huán)境下的PyTorch配置方法
這篇文章主要介紹了Anaconda+Pycharm環(huán)境下的PyTorch配置方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03