寫在前面
應(yīng)公司要求讓我做個(gè)內(nèi)部分享,所以我就寫了篇文章,順便也注冊一個(gè)簡書放上去了,這篇博客適合想學(xué)selenium的同學(xué),這是一個(gè)入門教程,由于網(wǎng)上大量window系統(tǒng)的教程,mac的較少、所以我就用Mac安裝了一遍相關(guān)的工具,做了個(gè)教程,此文較長。。。
目錄:
Python3.x環(huán)境安裝(mac)
PyCharm編譯器破解版安裝
Selenium的環(huán)境搭建(mac)
安裝瀏覽器驅(qū)動(dòng)chromedriver(mac)
python、selenium/webdriver常見基本語法
使用python3.X編寫測試腳本
一、python3.x環(huán)境安裝
在Mac上安裝Python
如果你正在使用Mac,系統(tǒng)是OS X >= 10.9,那么系統(tǒng)自帶的Python版本是2.7。要安裝最新的Python 3.7,有兩個(gè)方法:
方法一:從Python官網(wǎng)下載Python 3.7的安裝程序Python 3.7,雙擊運(yùn)行并安裝(傻瓜式操作一直下一步即可);
方法二:如果安裝了Homebrew,直接通過命令brew install python3安裝即可。
Python解釋器
當(dāng)我們編寫Python代碼時(shí),我們得到的是一個(gè)包含Python代碼的以.py為擴(kuò)展名的文本文件。要運(yùn)行代碼,就需要Python解釋器去執(zhí)行.py文件。
Mac電腦推薦:PyCharm
二、安裝PyCharm破解版
第一步:官方下載PyCharm專業(yè)版(如果你已經(jīng)下載有,建議你卸載刪除后(一定要把數(shù)據(jù)刪除干凈)重新下載,避免出現(xiàn)版本問題)
第二步:將DMG中的 PyCharm.app 拖動(dòng)至 “應(yīng)用程序”文件夾
第三步:下載JetbrainsCrack破解補(bǔ)丁包
第四步:將下載好的破解補(bǔ)丁包復(fù)制到 /Applications/PyCharm.app/Contents/bin/ 目錄中(找到應(yīng)用程序/Pycharm 右鍵顯示包內(nèi)容,就可以看到Contents文件夾)如圖:
[圖片上傳失敗...(image-b99f25-1608864322297)]
第五步:用編輯器打開 /Applications/PyCharm.app/Contents/bin/pycharm.vmoptions 文件,添加 -javaagent:/Applications/PyCharm.app/Contents/bin/JetbrainsCrack-release-enc.jar在最后一行。如圖:
[圖片上傳失敗...(image-429573-1608864322297)]
注意:路徑修改成你的pycharm安裝路徑,然后保存。
第六步:啟動(dòng)PyCharm,選擇激活碼激活,并在激活碼欄目輸入任意內(nèi)容,然后點(diǎn)擊ok即可。
大功告成:顯示到期日期為2100年

網(wǎng)上有不少用pip方式安裝selenium的,其實(shí)selenium本質(zhì)就是第三方庫,我們可以采用pycharm自帶方式來安裝
三、使用PyCharm安裝selenium庫文件
第一步:在PyCharm啟動(dòng)頁面進(jìn)入設(shè)置Preferences
[圖片上傳失敗...(image-6c6ae1-1608864322297)]
第二步:進(jìn)入Project Interpreter選項(xiàng),點(diǎn)擊“+”號

第三步:修改pip源,切換到國內(nèi)https://pypi.tuna.tsinghua.edu.cn/simple/

[圖片上傳失敗...(image-9a5bba-1608864322297)]
第四步:安裝selenium

四、安裝瀏覽器驅(qū)動(dòng)chromedriver(mac)
每個(gè)瀏覽器都有自己的驅(qū)動(dòng),比如谷歌的chromedriver、火狐的geckodriver、IE的IEDriverServer,
未安裝chrome驅(qū)動(dòng)時(shí),使用webdriver調(diào)chrome,并使用get方法傳url參數(shù)時(shí)會報(bào)錯(cuò);
TypeError: get() missing 1 required positional argument: 'url'
因此需要安裝相應(yīng)的瀏覽器驅(qū)動(dòng)。
以下我們以谷歌的chromedriver為例:
1、查看chrome版本:輸入chrome://settings/help
-
注意:<mark> chromedriver的版本一定要與chrome 瀏覽器的版本一致,否則在運(yùn)行的時(shí)候會報(bào)錯(cuò)</mark>
查看chrome版本
2、下載chromedriver
- 注意:<mark>需要翻墻才能下載</mark>
[圖片上傳失敗...(image-ba5275-1608864322297)]
3、拷貝到:usr/local/bin 。并不是usr/bin,因?yàn)闆]有系統(tǒng)管理員權(quán)限,拷貝到usr/bin下,很難成功,我嘗試直接粘貼,用命令拷貝等,都不行。最后發(fā)現(xiàn)拷貝到:usr/local/bin,就可以用了。簡單可行。

注意:<mark>常見報(bào)錯(cuò)原因:</mark>
- 瀏覽器和chromedriver版本不一致
- 防火墻導(dǎo)致無法訪問鉻瀏覽器,關(guān)閉防火墻
五、python、selenimu、webdriver基本語法
1、python基本語法:
推薦學(xué)習(xí)廖雪峰的python教程
2、selenium/webdriver常用知識點(diǎn):
- 瀏覽器操作
1、瀏覽器最大化
driver.maximize_window()
2、設(shè)置瀏覽器寬和高
driver.set_window_size(400,800)
3、控制瀏覽器前進(jìn)、后退
driver.forward()
driver.back()
4、刷新頁面
driver.refresh()
5、輸入網(wǎng)址
driver.get("http://wenku.baidu.com")
6、獲得當(dāng)前頁面title,判斷頁面跳轉(zhuǎn)是否符合預(yù)期
driver.title
7、獲得當(dāng)前URL,一般用來測試重定向
driver.current_url
- Selenium 八種元素定位方法
1、id定位
driver.find_element_by_id()
2、name定位
driver.find_element_by_name()
3、class定位
driver.find_element_by_class_name()
4、tag定位
driver.find_element_by_tag_name()
5、link定位
driver.find_element_by_link_text()
6、partial_link定位
driver.find_element_by_partial_link_text()
7、xpath定位
driver.find_element_by_xpath()
8、CSS定位
driver.find_element_by_css_selector()
- 操作測試對象
1、清除內(nèi)容,如默認(rèn)用戶名和密碼
driver.find_element_by_css_selector('xxxxx').clear()
2、模擬鼠標(biāo)點(diǎn)擊操作
driver.find_element_by_css_selector('xxxxx').click()
3、向輸入框輸入
driver.find_element_by_css_selector('xxxxx').send_keys()
4、提交表單
driver.find_element_by_css_selector('xxxxx').submit()
- WebElement接口常用方法
1、返回元素尺寸
driver.find_element_by_css_selector('xxxxx').size
2、獲取元素文本信息
driver.find_element_by_css_selector('xxxxx').text
3、獲取元素某個(gè)屬性值
driver.find_element_by_css_selector('xxxxx').get_attribute('type')
4、該元素用戶是否可見
driver.find_element_by_css_selector('xxxxx').is_displayde()
- 鼠標(biāo)事件
ActionChains類操作鼠標(biāo)事件ActionChains的使用:
首先引入:
from selenium.webdriver.common.actionchains import ActionChains
ActionChains的執(zhí)行原理調(diào)用ActionChains方法的時(shí)候,用戶行為不會立刻執(zhí)行,
而是將所有操作放在一個(gè)隊(duì)列中,當(dāng)執(zhí)行perform()方法時(shí),按照放入隊(duì)列的順序先進(jìn)先出執(zhí)行ActionChains方法的書寫格式
perform():執(zhí)行
1、鼠標(biāo)右擊
driver.find_element_by_css_selector('xxxxx').context_click()
2、鼠標(biāo)雙擊
driver.find_element_by_css_selector('xxxxx').double_click()
3、鼠標(biāo)點(diǎn)擊
driver.find_element_by_css_selector('xxxxx').click()
4、按住鼠標(biāo)左鍵(不抬起)
driver.find_element_by_css_selector('xxxxx').click_and_hold()
5、鼠標(biāo)移動(dòng)到某個(gè)元素
ActionChains(driver).move_to_element(目標(biāo)元素).perform()
6、鼠標(biāo)移動(dòng)到某個(gè)坐標(biāo)
ActionChains(driver).move_by_offset(xoffset,yoffset).perform()
7、將元素從起點(diǎn)source移動(dòng)到終點(diǎn)target
ActionChains(driver). drag_and_drop(source, target).perform()
8、按照坐標(biāo)移動(dòng)
ActionChains(driver). drag_and_drop_by_offset(source, xoffset, yoffset).perform()
- 鍵盤事件
Keys類操作鍵盤事件
Keys類的使用
首先引入:
from selenium.webdriver.common.keys import Keys
1、輸入框輸入內(nèi)容
driver.find_element_by_class_name('j-phone').send_keys('18519533777')
2、全選
driver.find_element_by_css_selector('xxxxx').send_keys(Keys.CONTROL,'a')
3、復(fù)制
driver.find_element_by_css_selector('xxxxx').send_keys(Keys.CONTROL,'c')
4、粘貼
driver.find_element_by_css_selector('xxxxx').send_keys(Keys.CONTROL,'v')
5、剪切
driver.find_element_by_css_selector('xxxxx').send_keys(Keys.CONTROL,'x')
6、回車鍵
driver.find_element_by_css_selector('xxxxx').send_keys(Keys.ENTER)
7、刪除鍵
driver.find_element_by_css_selector('xxxxx').send_keys(Keys.BACK_SPACE)
8、空格鍵
driver.find_element_by_css_selector('xxxxx').send_keys(Keys.SPACE)
9、制表鍵
driver.find_element_by_css_selector('xxxxx').send_keys(Keys.TAB)
10、回退鍵
driver.find_element_by_css_selector('xxxxx').send_keys(Keys.ESCAPE)
- selenium中的三種等待方式
1、顯示等待(導(dǎo)入 WebDriverWait 包)
顯示等待,同樣也是 webdirver 提供的方法。在設(shè)置時(shí)間內(nèi),默認(rèn)每隔一段時(shí)間檢測一次當(dāng)前頁面元素是否存在,如果超過設(shè)置時(shí)間檢測不到則拋出異常。默認(rèn)檢測頻率為0.5s,默認(rèn)拋出異常為:NoSuchElementException
WebDriverWait(driver,10).until(EC.presence_of_element_located(locator))
driver.find_element_by_id("kw").send_keys('abc')
2、隱式等待
隱式等待,也叫智能等待,是 webdirver 提供的一個(gè)超時(shí)等待。隱的等待一個(gè)元素被發(fā)現(xiàn),或一個(gè)命令完成。如果超出了設(shè)置時(shí)間的則拋出異常。
driver.implicitly(秒數(shù))
3、強(qiáng)制等待(導(dǎo)入 time 包)
強(qiáng)制等待,設(shè)置固定休眠時(shí)間。 python 的 time 包提供了休眠方法 sleep() , 導(dǎo)入 time 包后就可以使用 sleep(),進(jìn)行腳本的執(zhí)行過程進(jìn)行休眠。
time.sleep(秒數(shù))
- 定位frame中的對象
1、切換到iframe中
driver.switch_to.frame(id/name/xpath)
2、從未嵌套的iframe中返回(切到frame中之后,我們便不能繼續(xù)操作主文檔的元素,這時(shí)如果想操作主文檔內(nèi)容,則需切回主文檔。)
driver.switch_to.default_content()
3、從嵌套的iframe中返回(parent_frame()這個(gè)相當(dāng)于后退的方法,我們可以隨意切換不同的frame)
driver.switch_to.parent_frame()
- 多窗口處理
- 要想在多個(gè)窗口之間切換,首先要獲得每一個(gè)窗口的唯一標(biāo)識符號(句柄)。通過獲得的句柄來區(qū)別分不同的窗口,從而對不同窗口上的元素進(jìn)行操作
1、獲得當(dāng)前窗口的句柄
driver.current_window_handle
2、獲得所有窗口的句柄
driver.window_handles
3、切換回指定句柄的窗口
driver.switch_to_handle("句柄")
4、關(guān)閉當(dāng)前窗口
driver.close()
5、關(guān)閉所有窗口
driver.quit()
- 下拉菜單處理
導(dǎo)入Select類:from selenium.webdriver.support.select import Select
使用方法:Select(driver.find_element_by_name("xxx")).select_by_index()
1、根據(jù)index屬性定位選項(xiàng),index從0開始
Select(driver.find_element_by_css_selector('xxxxx').select_by_index(index))
2、根據(jù)value屬性定位
Select(driver.find_element_by_css_selector('xxxxx').select_by_value(value)
3、根據(jù)選項(xiàng)文本值來定位
Select(driver.find_element_by_css_selector('xxxxx').select_by_visible_text(text))
4、選擇第一個(gè)選項(xiàng)
Select(driver.find_element_by_css_selector('xxxxx').first_selected_option())
- 調(diào)用js代碼
1、調(diào)用js代碼
driver.execute_script()
舉個(gè)例子:
js = 'var a = 100; var b = 200; var c = a + b; alert(c)'
driver.execute_script(js)#會有彈框顯示300
- 處理cookie
1、獲得所有cookie
.driver.get_cookies()
2、獲得name屬性的cookie
.driver.get_cookie(name)
3、添加cookie(cookie格式為字典,)
.driver.add_cookie(cookie_dic)
4、刪除特定cookie
.driver.delete_cookie(name)
5、刪除所有cookie
.driver.delete_all_cookies()
六、使用python3.X編寫測試腳本
網(wǎng)易云音樂:
from selenium import webdriver
import time
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
# 設(shè)置為最大窗口
# driver.maximize_window()
driver.set_window_size(1400, 880)
# 設(shè)置隱式等待
driver.implicitly_wait(10)
# 訪問網(wǎng)易云音樂
driver.get('https://music.163.com')
driver.find_element_by_class_name('m-tophead').click()
driver.find_element_by_class_name('u-btn2-2').click()
# 輸入登錄手機(jī)號碼
driver.find_element_by_class_name('j-phone').send_keys('185xxxxxxxx')
# 輸入登錄密碼
driver.find_element_by_class_name('j-pwd').send_keys('oooooooo')
driver.find_element_by_class_name('j-primary').click()
# 搜索"講真的"歌曲
driver.find_element_by_id('srch').send_keys('講真的')
driver.find_element_by_id('srch').send_keys(Keys.ENTER)
driver.switch_to.frame('contentFrame')
# 點(diǎn)擊播放
driver.find_element_by_css_selector('.srchsongst>div:nth-child(1) .ply').click()
time.sleep(5)
driver.switch_to.parent_frame()
# 暫停音樂播放
ActionChains(driver).move_to_element(driver.find_element_by_css_selector('.m-playbar')).perform()
driver.find_element_by_css_selector('.ply').click()
# 發(fā)現(xiàn)音樂
driver.find_element_by_css_selector('.m-nav .fst').click()
# 點(diǎn)擊排行榜
driver.find_element_by_css_selector('.wrap .nav li:nth-child(2)').click()
driver.switch_to.frame('contentFrame')
div=driver.find_element_by_id('song-list-pre-cache')
tbody=div.find_element_by_tag_name('tbody')
trlist=tbody.find_elements_by_tag_name('tr')
driver.implicitly_wait(0)
for tr in trlist:
sftags = tr.find_elements_by_class_name('s-fc9')
if sftags:
# 歌曲名和演唱者名
songName=tr.find_element_by_css_selector('td .txt b').get_attribute('title')
authorName = tr.find_element_by_css_selector('td .text').get_attribute('title')
print('{:10s}:{}'.format(songName, authorName))
driver.implicitly_wait(10)
input('....')
driver.quit()
嗯~就這樣吧,如對文章有問題的小伙伴可以留言給我。下一篇出一個(gè)appium的教程。(未完待續(xù))
